Try with
template<typename T>
struct C {
template<typename Q = T,
typename std::enable_if<std::is_same<Q, int>::value, bool>::type = true>
int foo() { // .............................................^^^^^^^^^^^^^^^^^^^^
return 1;
}
template<typename Q = T,
typename std::enable_if<!std::is_same<Q, int>::value, bool>::type = true>
int foo() { // ..............................................^^^^^^^^^^^^^^^^^^^^
return 0;
}
};
重点是,在您的代码中,SFINAE 将启用/禁用模板类型参数的默认值;但默认值不参与重载决策,因此,在您的情况下,您有两个函数
template<typename, typename = void>
int foo() {
return 1;
}
template<typename, typename>
int foo() {
return 0;
}
具有相同的签名;所以编译器无法在两者之间进行选择,并且会给出错误。
我提出的代码是不同的,因为万一测试std::enable_if
为 false,您没有类型(左侧的元素=
),而不是值。诸如此类的东西
// ................VVVVVV what is = true ?
template<typename, = true>
int foo() {
return 1;
}
这是真正的“替换失败”,会禁用该方法。