无法初始化类中的unique_ptr向量
Can't initialize a vector of unique_ptr in class
目前,我有两个类,Ai
和Action
。
我的类Ai
获得一个名为_root
的成员Action
。
class Ai
{
public:
Ai();
~Ai();
private:
Action _root;
};
当我想使用构造函数Ai
初始化我的类Action
时,就会出现问题。
Ai::Ai() : _root(Action(0, AI, 0, 0))
{
}
我的类Action
我的构造函数:
class Action
{
public:
Action(int, Availability, int, int);
~Action();
private:
int _y;
int _x;
int _depth;
Availability _type;
vector<unique_ptr<Action>> _child;
};
Action::Action(int depth, Availability type, int y, int x)
{
this->_y = y;
this->_x = x;
this->_depth = depth;
this->_type = type;
}
问题恰恰发生在vector<unique_ptr<Action>> _child;
.
当我创建一个对象Ai
时,我的构造函数会创建一个具有默认值的对象Action
,但它无法初始化unique_ptr
的向量。
我的调试器收到此错误:
error: call to implicitly-deleted copy constructor of
'std::__1::unique_ptr<Action, std::__1::default_delete<Action> >'
::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
知道吗?
您声明Ai
构造函数的方式是创建一个临时Action
对象,然后将其复制到_root
.
解决方案很简单:
Ai::Ai() : _root(0, AI, 0, 0)
将构造函数参数直接传递给_root
。
不相关,您不需要使用this->
来访问Action::Action
中的成员变量。
类Action
不是用户定义的移动构造函数。它确实有一个用户定义的析构函数,可以防止自动生成移动构造器。Action
至少有一个成员(_child
(不能复制。因此,Action
也没有复制构造函数。
在 C++11 中,仅当Action
具有可访问的复制或移动构造函数时,才能执行_root(Action(0, AI, 0, 0))
。它两者都没有。要解决这个问题,你可以直接构造_root
(参见1201ProgramAlarm的答案(,或者要求编译器通过添加
Action(Action&&) = default;
请参阅此示例以获取 C++11
在 C++17 中,规则发生了变化,由于强制复制/移动省略,_root(Action(0, AI, 0, 0))
相当于_root(0, AI, 0, 0)
。代码应在没有可用的复制和移动构造函数的情况下进行编译(除非有其他原因导致编译失败(。
请参阅此示例以了解 C++17
相关文章:
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误