Ho una funzione di template sovraccarico:
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;
}
Se lo chiamo così:
auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template
tutto funziona perfettamente, ma
auto c = overMax<int>(4, 7.2); // error
provoca una chiamata ambigua.
Perché è così con int e OK quali altri tipi?
int
, stai specificando iltypename RT
o iltypename T1
? Poiché4
è anche unint
, potrebbe essere uno dei due. Condouble
,4
non corrisponde direttamente al tipodouble
, quindi è preferibile il secondo sovraccarico.