unique_ptr看不到派生类的自定义构造函数

unique_ptr does not see custom constructor for derived class

本文关键字:自定义 构造函数 派生 ptr 看不到 unique      更新时间:2023-10-16
class A{
string m_name;
int m_num;
public:
A(string name="", int number=0) : m_name(name), m_num(number)
{ cout << "ctorA " << m_name << endl; }
virtual ~A(){ cout << "dtorA " << m_name << endl; }
string getName(){ return m_name; }
void setName(const string name){ m_name = name; }
int getNumber(){ return m_num; }
};
class B : public A{
string m_s;
public:
B(string name="", int number=0, string s="")
: A(name, number){ m_s = s; }
string getS(){ return m_s; }
};

auto upB = unique_ptr<B>("B", 2, "B");   //ERROR HERE

error: no matching function for call to 'std::unique_ptr<B>::unique_ptr(const char [2], int, const char [2])'

我不明白为什么它看不到 B 构造函数。对我来说,一切似乎都很好。 与默认构造函数一起工作,如下所示:

auto upB = unique_ptr<B>();

我做错了什么还是派生类存在一些特殊问题?

auto upB = std::make_unique<B>("B", 2, "B");

auto upB = std::unique_ptr<B>(new B("B", 2, "B"));

在空std::unique_ptr<B>下面创建,就像nullptr.

auto upB = unique_ptr<B>();

我不明白为什么它看不到 B 构造函数。

请注意,unique_ptr<B>("B", 2, "B");不是试图调用B的构造函数,而是std::unique_ptr的构造函数。std::unique_ptr没有这样的构造函数,则编译失败。

我想你想要

auto upB = unique_ptr<B>(new B("B", 2, "B"));

即传递一个类型为B*的指针来构造一个unique_ptr<B>;你也可以使用std::make_unique,它将参数转发给B的构造函数来构造一个类型B的对象并将其包装在std::unique_ptr中。

auto upB = make_unique<B>("B", 2, "B");

关于auto upB = unique_ptr<B>();,你正在构造一个通过std::unique_ptr的默认构造函数不拥有任何东西的std::unique_ptr