Tôi có một chức năng mẫu quá tải:
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;
}
Nếu tôi gọi nó như thế này:
auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template
mọi thứ hoạt động hoàn hảo, nhưng
auto c = overMax<int>(4, 7.2); // error
gây ra cuộc gọi mơ hồ.
Tại sao nó lại như vậy với int , và OK loại nào khác?
int
, bạn đang chỉ địnhtypename RT
haytypename T1
? Vì4
cũng là mộtint
, nó có thể là một trong hai. Vớidouble
,4
không khớp trực tiếp với loạidouble
, do đó, quá tải thứ hai được ưu tiên.