Tengo una función de plantilla sobrecargada:
template<typename T1, typename T2>
auto overMax(T1 a, T2 b)
{
std::cout << __FUNCSIG__ << std::endl;
return b < a ? a : b;
}
template<typename RT, typename T1, typename T2>
RT overMax(T1 a, T2 b)
{
std::cout << __FUNCSIG__ << std::endl;
return b < a ? a : b;
}
Si lo llamo así:
auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template
todo funciona perfecto, pero
auto c = overMax<int>(4, 7.2); // error
provoca llamadas ambiguas.
¿Por qué es así con int y OK qué otros tipos?
int
, ¿está especificando eltypename RT
o eltypename T1
? Como4
también es unint
, podría ser cualquiera. Condouble
,4
no coincide directamente con el tipodouble
, por lo que se prefiere la segunda sobrecarga.