SFINAE意外结果

时间:2014-01-18 22:58:04

标签: c++ c++11 sfinae typetraits

尝试了解SFINAE。

template <class T, class T1 = void>
struct foo
{
    static constexpr char* a = "primary definition\n";
};

struct A
{
};

template <class T>
struct foo<T, std::enable_if<std::is_same<T, A>::value>::type>
{
    static constexpr char* a = "secondary definition\n";
};

编译器gcc-4.8.1给出错误

  

错误:模板参数列表中参数2的类型/值不匹配   对于'template struct foo'struct foo :: value&gt; :: type&gt;

1 个答案:

答案 0 :(得分:2)

  

C ++ 11标准:14.6 / 3

     

qualified-id 旨在引用不是当前实例化成员(14.6.2.1)及其嵌套名称说明符的类型时引用依赖类型,它应以关键字typename为前缀,形成 typename-specifier

T是从属类型,因此需要typename关键字:

struct foo<T, typename std::enable_if<std::is_same<T, A>::value>::type>
//            ^^^^^^^^

C ++ 14中还提供了一个辅助模板,它是一个返回类型的别名:

struct foo<T, std::enable_if_t<std::is_same<T, A>::value>>
//            ^^^^^^^^^^^^^^^^