Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost的无序映射::不可复制的can';t从运算符[]返回引用 演示我的问题,考虑这个不编译的简单程序: #include <boost/noncopyable.hpp> #include <unordered_map> class foo : boost::noncopyable { }; int main() { std::unordered_map<int, foo> m; auto & element = m[0]; return 0; } #包括 #包括 类foo:boost::不可复制{}; int main() { std::无序映射m; 自动&element=m[0]; 返回0; }_C++_Boost - Fatal编程技术网

C++ boost的无序映射::不可复制的can';t从运算符[]返回引用 演示我的问题,考虑这个不编译的简单程序: #include <boost/noncopyable.hpp> #include <unordered_map> class foo : boost::noncopyable { }; int main() { std::unordered_map<int, foo> m; auto & element = m[0]; return 0; } #包括 #包括 类foo:boost::不可复制{}; int main() { std::无序映射m; 自动&element=m[0]; 返回0; }

C++ boost的无序映射::不可复制的can';t从运算符[]返回引用 演示我的问题,考虑这个不编译的简单程序: #include <boost/noncopyable.hpp> #include <unordered_map> class foo : boost::noncopyable { }; int main() { std::unordered_map<int, foo> m; auto & element = m[0]; return 0; } #包括 #包括 类foo:boost::不可复制{}; int main() { std::无序映射m; 自动&element=m[0]; 返回0; },c++,boost,C++,Boost,Visual Studio 2012使用当前版本的boost(1.52)返回错误: 无法访问在类'boost::noncopyable\::noncopyable中声明的私有成员 std::unordered_map的操作符[]返回对所提供键处元素的引用,乍一看它应该可以工作——我要求的是对元素的引用,而不是它的副本 我对问题的理解是这样的(这可能是错误的,因为我暂时没有使用C++)。如果找不到键,无序映射将创建新元素并返回对新元素的引用。noncopyable定义了一个(私有)复制构造函数而不

Visual Studio 2012使用当前版本的boost(1.52)返回错误:
无法访问在类'boost::noncopyable\::noncopyable
中声明的私有成员

std::unordered_map的操作符[]返回对所提供键处元素的引用,乍一看它应该可以工作——我要求的是对元素的引用,而不是它的副本

我对问题的理解是这样的(这可能是错误的,因为我暂时没有使用C++)。如果找不到键,无序映射将创建新元素并返回对新元素的引用。noncopyable定义了一个(私有)复制构造函数而不是移动构造函数,因此移动构造函数不是由编译器生成的。在其操作符[]中,std::unordered_map使用std::move,但由于boost::noncopyable没有定义移动构造函数,它会返回到复制构造函数。由于复制构造函数是私有的,因此编译失败

促使我写这篇文章的原因是我试图创建boost::signal2::signal的无序映射,它继承自boost::noncopyable。除了破解boost库,还有什么简单的解决方法吗?将信号包装在一个独特的ptr中是一种选择,但在我看来,我可能在这里做错了什么

更新:
我可能发得太快了!似乎无法将boost::noncopyable的子类添加到无序的_映射。Insert、operator[]和emplace都使用复制构造函数(这是私有的)或移动操作(boost::noncopyable不存在)。对我来说,这似乎是一个很大的限制。甚至可以创建包含boost::noncopyable对象的无序_映射吗?我并不是要复制它们——我希望它们的整个生命周期都在无序映射中度过。

无序映射中使用
boost::noncopyable
的子类并非不可能,您只需为键入的内容定义一个移动构造函数即可。如果你已经制作了自己的复制结构(即<代码> Boo::不可复制< /COD>),C++就不会创建默认的移动构造函数。此外,如果它确实定义了默认的move构造函数,它将尝试调用父级的复制构造函数,该构造函数是私有的。因此,您必须定义一个移动构造函数,该构造函数不尝试调用
boost::noncopyable
的复制构造函数。例如,这很好:

#include <boost/noncopyable.hpp>
#include <unordered_map>

struct foo : public boost::noncopyable
{
    foo() = default;
    foo(foo&&) {}
};

int main()
{
    std::unordered_map<int, foo> m;
    auto & element = m[0];

    return 0;
}
#包括
#包括
struct foo:public boost::不可复制
{
foo()=默认值;
foo(foo&&{}
};
int main()
{
std::无序映射m;
自动&element=m[0];
返回0;
}

这可能不是你想要的,但我想我会把它扔出去。需要注意的一点是从
emplace()
返回的对的
second
值,这表示第二次调用不会引入新成员,也不会复制现有成员

再说一遍,我不知道这是否更接近你想要的,但值得一试。我可能做错了什么,因为我不像其他人那样对C++11标准库非常熟悉。很抱歉,如果是这样的话

最后,请注意,这并不是试图解决OP使用
运算符[]()
进行插入+访问的请求。相反,它试图简单地将一个
boost::noncopyable
派生构造成一个
无序的
映射。要访问,您可能需要结合以下内容以及初始的
find()
,以确定标记最初是否存在

无论如何

#include <boost/noncopyable.hpp>
#include <iostream>
#include <unordered_map>

class Foo : public boost::noncopyable
{
public:
    Foo(int value) : value(value) {};

    void setValue(int value) { this->value = value; }
    int getValue() const { return value; }

private:
    int value;
};


int main(int argc, char *argv[])
{
    typedef std::unordered_map<std::string, Foo> MyMap;
    MyMap mymap;

    // throw ("test".1) into the map
    auto p = mymap.emplace("test", 1);
    auto q = mymap.emplace("test", 2); // should not overwrite the first.

    // dump content
    cout << p.first->second.getValue() << '(' << p.second << ')' << ' '
         << q.first->second.getValue() << '(' << q.second << ')' << endl;

    // modify through the second returned iterator/bool pair.
    q.first->second.setValue(3);

    // dump again, see if p was also updated.
    cout << p.first->second.getValue() << '(' << p.second << ')' << ' '
         << q.first->second.getValue() << '(' << q.second << ')' << endl;

    return 0;
}

在将项目移动到哈希表中的过程中,复制是请求操作的本质。执行
insert()
时也会遇到同样的问题。我不知道一个人甚至可以有一个带有不可复制实体的
映射
无序映射
(关于这一点,
映射
的键)。如果不是这样的话,我想了解我自己。
emplace()
会为你想要的工作吗?你是对的。当项目从boost::noncopyable继承时,甚至无法将其添加到无序的映射中。请查看
emplace()
族。它可能会满足你的需求。祝你好运。我删除了我的答案,因为我认为这可能是一个库错误。标准规定,
操作符[]
只要求映射的类型是默认可构造的,而不是可复制或移动可构造的。您可以有一个映射,在该映射中,您只需使用
操作符[]
默认构造所有元素,然后只在以后修改它们。@WhozCraig:(.Emplace())没有可操作的移动构造函数,即使在概念上这正是我想要做的。我不想复制这些对象。我只想让它们生活在无序的_映射中,但这似乎是不可能的。我将此标记为解决方案,因为它解决了一般性讨论。它仍然不允许我制作boost::signals2::sign的无序_映射不过,由于该对象没有定义移动构造函数:(。这似乎是信号库设计中的一个疏忽(或者需要对C++11进行更新)。
1(1) 1(0)
3(1) 3(0)