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 RTo eltypename T1? Como4también es unint, podría ser cualquiera. Condouble,4no coincide directamente con el tipodouble, por lo que se prefiere la segunda sobrecarga.