此处的代码抱怨带有 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
只会拿指针而无需考虑它指向的内容?
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())
如果你愿意,你也可以。