声明包含std :: unique_ptr的结构的std :: vector类时出错

西蒙·阿克斯

尽管已经使用C#进行了几年的工作,但是用C ++完成事情对我来说仍然有些困难。我完全接受智能指针的用法,但是现在我面临以下难题

我有一个结构Foo,例如

struct Foo
{
    Foo(std::unique_ptr<Bar> bar) : m_myBar(std::move(bar)) {}

 private:
    std::unique_ptr<Bar> m_myBar;           
};

在不同的类中,我想要一个包含Foo实例的向量,但是以下行

 std::vector<Foo> m_Foos;

产生编译错误,指出复制构造函数已删除。在SO线程“为什么不能将unique_ptr推回向量中? ”给出了解释以及解决方法。但是,这里的问题涉及一个唯一指针的向量,而我有一个包含唯一指针的结构的向量。建议的解决方案是使用移动语义,但这在我的情况下如何应用?还是我应该做别的事情?

Angew不再为SO感到骄傲

如您所说,m_Foos实际上是另一个类的数据成员(我将其称为FooHolder)。如果您没有提供的复制构造函数FooHolder,则编译器会自动生成一个。该副本构造函数将调用的所有数据成员的副本构造函数FooHolder,包括m_Foos当然,的复制构造函数std::vector<Foo>包含编译错误,因为它Foo是不可复制的。这可能是您收到错误的原因。

FooHolder如果您能够并且希望该类是可复制的,则必须为它提供适当的复制构造函数否则,您可以只声明一个移动构造函数(可能是默认的),这将使副本构造函数被删除:

struct FooHolder
{
  FooHolder(FooHolder&&) = default;

private:
  std::vector<Foo> m_Foos;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将std :: unique_ptr传递给类时出错

使用std :: map时,包含unique_ptr的结构中的默认析构函数会导致编译错误

错误C2248:'std :: unique_ptr <_Ty> :: unique_ptr':无法访问在类'std :: unique_ptr <_Ty>'中声明的私有成员

调整大小std :: vector <std :: unique_ptr <T >>的性能

std :: vector <std :: unique_ptr <int>>不编译

如何使用std:unique_ptr擦除包含结构的向量?

std :: unique_ptr结构成员为结构类型

C ++-vector <>中的std :: unique_ptr为nullptr

构造类成员std :: vector <std :: unique_ptr <AClass>的智能方法

将std :: unique_ptr类成员标记为const

使用std :: unique_ptr时出现内存泄漏

将std :: unique_ptr推回std :: vector时,编译器不会失败

使用`std :: unique_ptr`时`std :: vector`中的数据不同

当unique_ptr在向量中时,对std :: unique_ptr <>拥有的对象的引用/ ptr是否安全?

如何在结构上使用std :: unique_ptr?

如何将包含 std::unique_ptr 的 std::optional 结构传递给函数?

如何调整std :: vector <std :: queue <std :: unique_ptr <int >>>的大小?

std :: remove_if来自std :: vector的多态std :: unique_ptr

将std :: vector <std :: unique_ptr <T >>分配给另一个std :: vector <std :: unique_ptr <T >>

从std:unique_ptr隐式转换为布尔值时出错

从初始化列表构造std :: map <T,unique_ptr <S >>时出错

奇怪的错误:当未真正创建指针时,使用删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr

双向链接列表std :: unique_ptr类在删除节点时无法按预期工作

'operator[]' 不匹配(操作数类型是 'std::unique_ptr<std::vector<int> >' 和 'int')

如何检查std :: unique_ptr是否为空(如果它位于std :: vector中)?

还有什么更好的替代std :: vector <std :: unique_ptr <T >>吗?

是否可以使用fill构造函数创建std :: vector <std :: unique_ptr <Bar >>?

std :: vector <std :: unique_ptr <>> :: push_back()的正确语法是什么?

使用std :: vector <double>访问由std :: unique_ptr <double [2]>管理的数据