Ваш код имеет две проблемы:
- SFINAE работает только в зависимых контекстах. Поскольку ничего в
typename std::enable_if<!std::is_same<Char, char>::value>::type
не зависит от каких-либо параметров шаблона, SFINAE не применяется, и вы получаете серьезную ошибку, поскольку std::enable_if<false>::type
недопустимо.
- При определении «уникальности» шаблонов учитываются только сами типы параметров, а не их значения по умолчанию. У вас есть два определения шаблона функции
template <typename> String FromACString(const char*)
, и это ошибка.
Чтобы исправить первую проблему, вы можете ввести другой параметр шаблона со значением по умолчанию Char
. Обычное решение второй проблемы - использование самого выражения enable_if
в качестве типа параметра шаблона вместо значения по умолчанию. Это оставляет вас с чем-то вроде этого:
template <typename C = Char,
std::enable_if_t<!std::is_same<C, char>::value>* = nullptr>
String FromACString(const char* p_src) {
//...
}
template <typename C = Char,
std::enable_if_t<std::is_same<C, char>::value>* = nullptr>
String FromACString(const char* p_src) {
//...
}
Демо-версия
Теперь, в зависимости от того, как определено Char
, вы получите один шаблон с подписью
template <typename, void*>
String FromACString(const char*);
и другой, который плохо сформирован и, следовательно, отключен SFINAE.