无法访问在class中为make_unique声明的私有成员

问题描述 投票:0回答:1

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

c++
1个回答
2
投票
  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

不会使用它

0
投票

正在通话中

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

参数在new运算符的调用中由copy使用。但是类A的副本构造函数是私有的。

您可以代写

p_b = std::make_unique<A>( i_b );
© www.soinside.com 2019 - 2024. All rights reserved.