目前,我有Ai
和Action
这两个类。
我的班级Ai
获得了一个名为Action
的成员_root
。
class Ai
{
public:
Ai();
~Ai();
private:
Action _root;
};
当我想用构造函数Action
初始化类Ai
时发生问题。
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)...);
有什么主意吗?
答案 0 :(得分:4)
以声明Ai
构造函数的方式,您正在创建临时 Action
对象,然后将其复制到_root
。
解决方案很简单:
Ai::Ai() : _root(0, AI, 0, 0)
直接将构造函数参数传递给_root
。
不相关,您无需使用this->
来访问Action::Action
中的成员变量。
答案 1 :(得分:0)
类Action
不是用户定义的move构造函数。它确实具有用户定义的析构函数,可防止自动生成移动构造函数。 Action
至少有一个成员(_child
)无法复制。因此,Action
也没有副本构造函数。
在C ++ 11中,只有在_root(Action(0, AI, 0, 0))
可以访问复制或移动构造函数的情况下,才能执行Action
。它既没有。要解决此问题,您可以直接构造_root
(请参见 1201ProgramAlarm 的答案),或要求编译器通过添加
Action(Action&&) = default;
See this example for C ++ 11
在C ++ 17中,规则已更改,由于mandatory copy/move elision,_root(Action(0, AI, 0, 0))
等效于_root(0, AI, 0, 0)
。该代码应在没有复制和移动构造函数的情况下进行编译(除非有其他导致编译失败的原因)。
See this example for C ++ 17