【问题标题】:cannot access private member declared in class for make_unique无法访问在 make_unique 类中声明的私有成员
【发布时间】:2019-10-16 11:39:25
【问题描述】:

我有以下类: 删除了复制构造函数的 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;”错误将得到解决。但我正在寻找一些解释。

【问题讨论】:

  • 附带说明,更典型的做法是将deleted 函数声明为public - 这样您就可以得到清晰的错误消息,而不是将其隐藏在cannot access private member 之下。当我们无法使用 delete 关键字时,将复制构造函数声明为 private 是一种旧的(C++11 之前的)方法来禁用它们。

标签: c++


【解决方案1】:
  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不能使用它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 2012-11-15
    • 1970-01-01
    • 2018-07-22
    • 2014-08-23
    • 2013-07-17
    相关资源
    最近更新 更多