std :: unique_ptr和模板

时间:2016-02-02 13:02:16

标签: c++ c++11

我有一个使用CRTP的场景。下面的伪代码:

template <typename T>
class Base {} 

class Derived1 : Base < Derived1 >  {}

class Derived2 : Base < Derived2 > {} 

除非我将unique_ptr引入循环,否则一切正常。我想要unique_ptrBase,代码中的其他地方使用此权限来获取Derived1Derived2指针的所有权。

// declaration - this is the problem - wont compile.
std::unique_ptr<Base> base_unique_ptr;

// cpp , elsewhere.
base_unique_ptr.reset(new Derived1());

base_unique_ptr.reset(new Derived2());

我遇到了麻烦吗?我不想更改unique_ptr的现有代码使用。

2 个答案:

答案 0 :(得分:6)

Base不是一个合适的类型。您需要为Base指定模板参数。我假设你想要Derived1和Derived2 base_unique_ptr,这是不可能的,因为它们有不同的基类。 Base<Derived1>Base<Derived2>是不同的类型。

答案 1 :(得分:1)

它不起作用,因为Base不是一种类型。例如,您可以使用std::unique_ptr<Base<Derived1>>指向该类型的对象。此外,继承是私有的,因此派生指针不能转换为父级。

如果你想拥有一个可以指向类模板的任何实例的指针,那么你可以通过从非tamplate基类继承模板来为它们提供一个公共基础。

struct Base {
    virtual ~Base(){} // don't forget the virtual destructor
};
template<typename T>
struct TBase: Base {};
struct Derived1: TBase<Derived1> {};
struct Derived2: TBase<Derived2> {};

// elsewhere
std::unique_ptr<Base> base_unique_ptr;
base_unique_ptr.reset(new Derived1);
base_unique_ptr.reset(new Derived2);