2017-02-20 4 views
2

Я реализую довольно сложную функциональность на основе шаблонов, и я пришел к ошибке, которую я не могу решить. Я упростил свой случай к этому коду:Как разрешить объявление типа шаблона типа C++

template <typename Head, typename... T> 
struct BaseIsFirst { 
    using Base = Head; 
}; 

template <typename T, typename D> 
struct IAction { 
    std::enable_if_t<std::is_same<T, D::Base>::value> do_action() {} 
}; 

struct Base; 
struct Derived1; 
struct Derived2; 
typedef BaseIsFirst<Base, Derived1, Derived2> MyBIF; 

struct Base : public IAction<Base, MyBIF> { }; 
struct Derived1 : public Base {}; 
struct Derived2 : public Base {}; 

Если я пытаюсь скомпилировать это я получаю сообщение об ошибке:

'std::is_same': 'D::Base' is not a valid template type argument for parameter '_Ty2'

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

+0

Кроме того, вы используете 'enable_if' неправильно, если вы действительно не хотите, чтобы это была ошибка в ложном случае. –

ответ

2

При использовании типа, определенного параметром шаблона, необходимо указать, что это тип. Нет ничего плохого в вашем заявлении. Попробуйте это вместо этого

template <typename T, typename D> 
struct IAction { 
    std::enable_if_t<std::is_same<T, typename D::Base>::value> do_action() {} 
    //    Add typename here ^^^^^^^^ 
}; 
Смежные вопросы