Почему ни один из этих шаблонов функций не соответствует экземплярам?

Следующий код не может быть скомпилирован с Intel C ++ 2013.

#include <type_traits>
#include <iostream>template <
typename T,
typename std::enable_if<std::is_integral<T>::value>::type
>
void myfunc( T a)
{
std::cout << a << std::endl;
}

template <
typename T,
typename std::enable_if<!std::is_integral<T>::value>::type
>
void myfunc( T a)
{
std::cout << a << std::endl;
}int main()
{
double a;
int b;
myfunc(a);
myfunc(b);

return 0;

}

Вот вывод ошибки:

ConsoleApplication1.cpp(33): error : no instance of overloaded function "myfunc" matches the argument list
1>              argument types are: (double)
1>      myfunc(a);
1>      ^
1>
1>ConsoleApplication1.cpp(34): error : no instance of overloaded function "myfunc" matches the argument list
1>              argument types are: (int)
1>      myfunc(b);
1>      ^
1>

Куда я иду не так?

2

Решение

Обычный и правильный способ использования enable_if в функции это вставить его в тип возвращаемого значения.

template <typename T>
typename std::enable_if<std::is_integral<T>::value>::type myfunc(T a) {
std::cout << a << " (integral)" << std::endl;
}

template <typename T>
typename std::enable_if<!std::is_integral<T>::value>::type myfunc(T a) {
std::cout << a << " (non-integral)" << std::endl;
}

Для вашего варианта правильный путь:

template <typename T,
typename = typename std::enable_if<std::is_integral<T>::value>::type>
void myfunc(T a) {
std::cout << a << " (integral)" << std::endl;
}

… «enable_if» является аргумент шаблона по умолчанию. И это не работает в вашем случае, потому что эта функция не перегружена.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]