如何将unique_ptr的向量声明为类数据成员?

时间:2012-01-24 14:15:22

标签: c++ visual-studio-2010 vector unique-ptr

我想将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的便利性。我想要我的蛋糕,我也想吃它!

5 个答案:

答案 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