2016-02-02 3 views
0

У меня есть сценарий, где я использую CRTP. Псевдо код ниже:std :: unique_ptr и шаблон

template <typename T> 
class Base {} 

class Derived1 : Base <Derived1> {} 

class Derived2 : Base <Derived2> {} 

все хорошо, за исключением, когда я ввожу unique_ptr в петле работает. Я хочу иметь unique_ptr до Base и в других местах этого кода. Используйте это, чтобы взять напрокат указатель Derived1 или Derived2.

// 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.

+0

Запишите свое определение unique_ptr (как код, а не псевдокод). – MagunRa

ответ

5

Base не является подходящим. Вам нужно указать аргумент шаблона для Base. Я предполагаю, что вы хотите base_unique_ptr для Derived1 и Derived2, что невозможно, так как они имеют разные базовые классы. Base<Derived1> и Base<Derived2> - разные типы.

+0

О, конечно. Duh! Спасибо что подметил это. – user3613174

1

Это не работает, потому что Base не является типом. Вы можете использовать std::unique_ptr<Base<Derived1>>, например, чтобы указать на объекты этого типа. Кроме того, наследование является приватным, поэтому производный указатель не будет конвертирован в родительский.

Если вы хотите иметь указатель, который может указывать на любой экземпляр шаблона класса, то вы можете дать им общую базу, наследуя шаблон от базового класса без шаблона.

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); 
Смежные вопросы