不能 make_unique 基类

Top*_*ort 0 c++ unique-ptr

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

以下是错误消息:

error C2259: 'Abstract': cannot instantiate abstract class
Run Code Online (Sandbox Code Playgroud)

我以为unique_ptr只会拿指针而无需考虑它指向的内容?

Nic*_*las 5

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())如果你愿意,你也可以。