我有以下类:具有已删除副本构造函数的A类。
class A
{
public:
explicit A(int i_a) {a = i_a;};
~A(){};
private:
A(const A&) = delete;
A& operator=(const A&) = delete;
int a;
};
和具有唯一性成员的B类。
class A;
class B
{
public:
B(int i_b);
~B() {};
private:
std::unique_ptr<A> p_b;
};
和B.cpp:
B::B(int i_b)
{
p_b = std::make_unique<A>(A(i_b));
}
制作A类的unique_ptr时收到此错误:
'A :: A':无法访问类'A'中声明的私有成员
有人可以解释一下为什么我收到此错误吗?我知道通过注释此行“ A(const A&)= delete;”错误将得到解决。但是我正在寻找一些解释。
p_b = std::make_unique<A>(A(i_b));
在此行中,您尝试调用具有delete
d的副本构造函数(或移动未声明的构造函数)
相反,您应该使用:
p_b = std::make_unique<A>(i_b);
或者您可以为您的类声明move构造函数:
class A
{
public:
explicit A(int i_a) {a = i_a;};
A(A&&) = default;
A& operator=(A&&) = default;
~A(){};
private:
A(const A&) = delete;
A& operator=(const A&) = delete;
int a;
};
std::make_unique
将调用给定类的构造函数,并按原样传递已接收的任何参数。因此,如果您传递A
类型的对象,它将尝试使用接受A
类型参数的构造函数-即复制构造函数或移动构造函数。因为已经声明了复制构造函数,所以移动构造函数不会自动生成,因此std::make_unique
正在通话中
p_b = std::make_unique<A>(A(i_b));
参数在new运算符的调用中由copy使用。但是类A
的副本构造函数是私有的。
您可以代写
p_b = std::make_unique<A>( i_b );