Я пишу как новый ответ, потому что он не подходит для комментариев. Для дополнения к @ Jarod42.
Кажется, вы предполагали, что
template<typename U = T, typename std::enable_if<std::is_same<U, BLA>::value, void>::type>
заменяет
template<typename U = T, typename = void>
, но это не так. Он заменяет
template<typename U = T, void>
.
Итак, вы должны объявить его как
template<typename U = T, typename = typename std::enable_if<std::is_same<U, BLA>::value, void>::type>
.
Поскольку typename
, который вы использовали для указания типа, зависит, а не для объявления параметра шаблона , Но любой из них не будет работать так, как вы ожидали. Один бесшумно удаляет некорректное, другой приводит к многократному объявлению одной и той же функции.
После вашего комментария я пытаюсь объяснить более подробно.
template<typename U = T, typename std::enable_if<std::is_same<U, BLA>::value, void>::type>
void someFunction()
{
std::cout << "someFunction()\n";
}
Если T == BLA
, U
становится BLA
и составляет std::is_same< U , BLA>::value
true
. Таким образом, результат выглядит следующим образом:
template<typename U = BLA, void>
Если T == NotBlaType
, U
становится NotBlaType
и составляет std::is_same<U,BLA>::value
false
. Результатом является ошибка подстановки, std::enable_if<false,void>
не имеет type
.
Но в обоих случаях функция не объявлена. Поскольку void
не может быть разрешено как нетипизированный параметр шаблона .
Но если мы изменим void
на int
, то это будет разрешено. Вот почему @ Jarod42 предлагает int
.
template<void>
недопустимо.
Но template<int = 2>
законно.
После того, как заявление объявлено правильно, вы должны условно переключать объявления функций (потому что обе функции имеют одинаковую подпись, поэтому вызывает многократное объявление). Вот почему обе функции в ответе @ Jarod42 имеют std::enable_if
, что равнозначно отрицанию друг друга.