此处的代码抱怨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
只会拿指针而不考虑它指向的是什么?
答案 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);