首页 > 解决方案 > 无法访问在 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;” 错误将得到解决。但我正在寻找一些解释。

标签: c++

解决方案


  p_b = std::make_unique<A>(A(i_b));

在这一行中,您尝试调用具有deleted 的复制构造函数(或未声明的移动构造函数)

相反,您应该使用:

  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


推荐阅读