我想将unique_ptr的向量作为我正在制作的类的成员。
class Foo {
[...]
private:
vector<unique_ptr<Bar>> barList;
}
然后我开始从 VS2010 编译器获取神秘的错误消息:
error C2248: 'std::unique_ptr<_Ty>::operator =' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
除了下面的一些错误行,这些错误行分为微软std::_Copy_impl<>
的实现......
我将会员声明改为
vector<unique_ptr<Bar>>* barList;
它编译。但我不禁想知道为什么我不能按照我原来想要的方式去做?对于笑容,我试过这个并且它工作正常:
vector<Bar> barList;
但现在我失去了unique_ptr
的便利性。我想要我的蛋糕,我也想吃它!
答案 0 :(得分:11)
问题在于某处,您的代码正在尝试调用Foo
的“复制分配”运算符。
这会导致编译器尝试生成一个复制赋值运算符,该运算符调用Foo
的所有子对象的复制赋值运算符。最终,这导致尝试复制unique_ptr
,这是一项不可能的操作。
答案 1 :(得分:5)
unique_ptr
没有复制语义,因此您不能使用任何复制包含对象的方法。您可以使用std::move
在其尝试复制的位置使用右值引用来执行此操作。在没有看到你的代码的情况下,我无法说明那将是什么。
如果它以第二种形式编译,要么你没有运用相同的代码,要么存在编译器错误。两者都应该以同样的方式失败。
你的第三个例子,按值存储是最简单的方法,除非你的对象庞大且价值昂贵,可以按值存储/复制。
答案 2 :(得分:3)
通常某处std::move(iUniquePtr)
丢失(例如,使用push_back时)。
答案 3 :(得分:0)
摘自www.cplusplus.com
std::unique_ptr::operator=
unique_ptr赋值 该对象获取x的内容的所有权,包括存储的指针和存储的删除器(以及在某些时候删除对象的责任)。删除调用之前unique_ptr对象拥有的任何对象(就像调用unique_ptr的析构函数一样)。
但也有警告:
此页面描述了最新版本的C ++标准(2011)引入的功能。较旧的编译器可能不支持它。
MSVC 2010将operator=
定义为私有(不可复制),但支持swap
方法。
答案 4 :(得分:-3)
你不能在向量中使用unique_ptr,因为向量实现强烈依赖于值赋值运算符,它在unique_ptr
中是私有的。使用来自C ++ 11的boost或其他智能ptr实现的shared_ptr
。