Попробуйте с
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
ложный, у вас нет типа (элементаслева от =
), а не от значения.Что-то вроде
// ................VVVVVV what is = true ?
template<typename, = true>
int foo() {
return 1;
}
, что является настоящей «ошибкой замещения», которая отключает метод.