c++ - 使用包含 std::unique_ptr 的结构的 std::vector 声明类时出错

标签 c++ c++11 vector unique-ptr

虽然我已经使用 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/

相关文章:

c++ - 如何将元素添加到指针 vector 中?

c++ - 用const重载Matrix类的[]运算符

c++ - 使用迭代器获取 vector 的索引

c++ - std::vector<T> 的字符串表示

gcc - 使用 c++0x 在 g++ 上出现 strdup 错误

c++11 - C++ 14 主函数的形式

c++ - 强制函数内的静态常量在开始时进行评估?

c++ - 如何使用 visual studio 2015 在 Windows 7 中构建最新的 tesseract 3.04

c++ - 当 C 和 C++ 中严格要求内存释放时?

C++ 如何使用 OpenSSL 验证 Google JWT (RS256)