尝试了解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;
答案 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>>
// ^^^^^^^^^^^^^^^^