虽然我已经使用 C# 工作了几年,但用 C++ 完成工作有时对我来说仍然很困难。我完全接受智能指针的使用,但现在我面临以下难题
我有一个结构Foo
,例如
struct Foo
{
Foo(std::unique_ptr<Bar> bar) : m_myBar(std::move(bar)) {}
private:
std::unique_ptr<Bar> m_myBar;
};
在另一个类中,我想要一个包含 Foo 实例的 vector ,但是下面这行
std::vector<Foo> m_Foos;
产生编译错误,指出拷贝构造函数被删除。在 SO 线程“Why can I not push_back a unique_ptr into a vector?”中给出了解释和补救措施。但是,那里的问题涉及唯一指针的 vector ,而我有一个包含唯一指针的结构 vector 。建议的解决方案是使用移动语义,但这如何适用于我的情况?还是我应该做点别的?
最佳答案
如你所说,m_Foos
实际上是另一个类的数据成员(我称之为 FooHolder
)。如果您没有为 FooHolder
提供复制构造函数,编译器会自动生成一个。该复制构造函数将调用 FooHolder
的所有数据成员的复制构造函数, 包括 m_Foos
.当然是std::vector<Foo>
的拷贝构造函数包含编译错误,因为 Foo
不可复制。这可能就是您收到错误的原因。
您必须为 FooHolder
提供适当的复制构造函数,如果您能够并希望该类是可复制的。否则,您可以只声明一个移动构造函数(可能是默认的),这将使复制构造函数被删除:
struct FooHolder
{
FooHolder(FooHolder&&) = default;
private:
std::vector<Foo> m_Foos;
};
关于c++ - 使用包含 std::unique_ptr 的结构的 std::vector 声明类时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26115452/