Конфликт дедукции.
Дано
template<class T>
T maxOfTwo(T a,T b)
{
return a>b?a:b;
}
Если вы позвоните maxOfTwo(3,6.3)
, первое значение будет int
; второй - float
.
Компилятор должен вывести один тип T
и не знать, если выбрано int
или float
.
Случай maxOfTwo1()
отличается тем, что тип аргумента фиксируется на int
, а компилятору просто нужно преобразовать значение float
в значение int
.
Если вы можете использовать хотя бы C ++ 14, вы можете решить, используя два типа шаблона и возвращаемый auto
тип
template <typename T1, typename T2>
auto maxOfTwo (T1 a, T2 b)
{ return a>b?a:b; }
В C ++ 11 немного более многословно и менее элегантно
template <typename T1, typename T2>
auto maxOfTwo (T1 a, T2 b) -> decltype( a>b ? a : b )
{ return a>b?a:b; }
или вы можете использовать std::common_type
(как предложено Якком)
template <typename T1, typename T2>
typename std::common_type<T1, T2>::type maxOfTwo (T1 a, T2 b)
{ return a>b?a:b; }
В противном случае вы можете явно указать правильный тип, вызывая функцию
maxOfTwo<int>(3, 6.3);