如何解析C ++模板类型声明顺序

时间:2017-02-20 16:39:35

标签: c++ template-meta-programming

我实施了一个非常复杂的基于模板的功能,而且我遇到了一个我无法解决的错误。我已将此案例简化为此代码:

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 {};

如果我尝试编译它,我会收到错误:

  

&#39; std :: is_same&#39;:&#39; D :: Base&#39;不是有效的模板类型参数   参数&#39; _Ty2&#39;

我认为之前无法定义使用的类型。是否有解决方法,或者根本不可能?

1 个答案:

答案 0 :(得分: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 ^^^^^^^^
};