Специализация шаблона и проблемы enable_if [дубликаты]
На этот вопрос уже есть ответ здесь:
SFINAE работает в типе возврата, но не в качестве параметра шаблона 3 ответаЯ сталкиваюсь с проблемой, касающейся правильного использования enable_if и специализации шаблона.
После изменения примера (по соображениям конфиденциальности), вот сопоставимый пример:
У меня есть функция под названием "меньше", которая проверяет, является ли 1-й аргумент меньше, чем 2-й аргумент. Допустим, я хочу иметь 2 разных типа реализаций в зависимости от типа ввода - 1 реализация для целого числа и другая для двойного.
Код, который у меня есть, выглядит примерно так:
#include <type_traits>
#include <iostream>
template <class T,
class = typename std::enable_if<std::is_floating_point<T>::value>::type>
bool less(T a, T b) {
// ....
}
template <class T,
class = typename std::enable_if<std::is_integral<T>::value>::type>
bool less(T a, T b) {
// ....
}
int main() {
float a;
float b;
less(a,b);
return 0;
}
Приведенный выше код не компилируется, потому что - он говорит, что я переопределяю метод less.
Ошибки:
Z.cpp:15:19: error: template parameter redefines default argument
class = typename std::enable_if<std::is_integral<T>::value>::type>
^
Z.cpp:9:19: note: previous default template argument defined here
class = typename std::enable_if<std::is_floating_point<T>::value>::type>
^
Z.cpp:16:11: error: redefinition of 'less'
bool less(T a, T b) {
^
Z.cpp:10:11: note: previous definition is here
bool less(T a, T b) {
^
Z.cpp:23:5: error: no matching function for call to 'less'
less(a,b);
^~~~
Z.cpp:15:43: note: candidate template ignored: disabled by 'enable_if'
[with T = float]
class = typename std::enable_if<std::is_integral<T>::value>::type>
^
3 errors generated.
Может кто-то указать, в чем здесь ошибка?