gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:20 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com