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>();
我做错了什么或派生类有什么特殊问题吗?
答案 0 :(得分:9)
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>();
答案 1 :(得分:2)
我不明白为什么它没有看到B构造函数。
请注意,unique_ptr<B>("B", 2, "B");
并未尝试调用B
的构造函数,而是std::unique_ptr
's constructor。 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
的默认构造函数拥有任何内容。