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

时间:2018-02-16 15:29:16

标签: c++ c++11 c++14

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>();

我做错了什么或派生类有什么特殊问题吗?

2 个答案:

答案 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 constructorstd::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的默认构造函数拥有任何内容。