无法使_unique成为基类

时间:2019-07-05 05:05:19

标签: c++ unique-ptr

此处的代码抱怨push_back的行试图创建Abstract类型的对象。

#include <vector>
#include <memory> 

class Abstract
{
public:
    Abstract() {}
    virtual void   f()  = 0;
};

class Derived : public Abstract
{
public:
    Derived()  {}
    void f()  override  {   }
};

int main (int argc, char** argv) 
{
    std::vector<std::unique_ptr<Abstract>> vec;

    vec.push_back (std::make_unique<Abstract>(new Derived)); 

    return 0;
}

以下是错误消息:

error C2259: 'Abstract': cannot instantiate abstract class

我认为unique_ptr只会拿指针而不考虑它指向的是什么?

2 个答案:

答案 0 :(得分:4)

make_unique<T>创建一个T类型的对象。 总是。基本上是return unique_ptr<T>(new T(args...));

如果您使用new自己创建指针,则不想将该指针传递给make_unique。除非您正在做make_unique<T*>或需要一个指向对象的指针的东西,否则不会。

您可以push_back(std::unique_ptr<Abstract>(new Derived())),也可以emplace_back(new Derived())

答案 1 :(得分:1)

您可以使用emplace_back在适当的位置构造对象:

vec.emplace_back (new Derived);