c++ - 无法访问在 make_unique 类中声明的私有成员
问题描述
我有以下类: 删除了复制构造函数的 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;
};
和具有 unique_ptr 成员的 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);
或者您可以为您的类声明移动构造函数:
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
推荐阅读
- if-statement - 如果在 Wixcode 中单击按钮后出现其他情况
- mongodb - 无法为 mongo db 创建目录
- python - 我在哪里可以找到关于 PyTorch 的 Tensor.unfold() 用于获取图像补丁的直观解释?
- google-analytics - 用户对此属性没有足够的权限
- javascript - 我是 javqascript 和 html 的新手,如何在 html 中有一个文本框,告诉 js 的答案使其成为变量
- r - 如何从头开始使用 R 为特定“性别”生成随机缺失 (MAR) 数据
- python - Python多处理PID不匹配
- python - 如何分离 aiff 频道并将其保存为 wav 格式?
- javascript - RxJS:计算集合项的更改
- python - 返回新变量中列表的元素并将其从列表中删除