代码之家  ›  专栏  ›  技术社区  ›  code

unique\u ptr未看到派生类的自定义构造函数

  •  -1
  • code  · 技术社区  · 6 年前
    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 回复  |  直到 6 年前
        1
  •  9
  •   3CxEZiVlQ    6 年前
    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>();
    
        2
  •  2
  •   songyuanyao    6 年前

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

    请注意 unique_ptr<B>("B", 2, "B"); 未尝试调用 B 的构造函数,但 std::unique_ptr 's constructor . std::unique\u ptr 没有这样的构造函数,则编译失败。

    我想你想要

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

    i、 e.传递类型为的指针 B* 构建 unique_ptr<B> ; 您还可以使用 std::make_unique ,它将参数转发给的构造函数 B 构造类型为的对象 B 然后用 std::unique\u ptr .

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

    关于 auto upB = unique_ptr<B>(); ,您正在构建 std::unique\u ptr 通过 std::unique\u ptr 的默认构造函数。