ฉันมีฟังก์ชั่นเทมเพลตมากเกินไป:
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;
}
ถ้าฉันเรียกมันว่าสิ่งนี้:
auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template
ทุกอย่างใช้งานได้ดี แต่
auto c = overMax<int>(4, 7.2); // error
ทำให้เกิดการโทรที่ไม่ชัดเจน
ทำไมถึงเป็นเช่นนั้นด้วยintและ OK เป็นประเภทอื่น
int
คุณจะระบุtypename RT
หรือtypename T1
? ตั้งแต่4
ยังเป็นint
มันอาจเป็นได้ทั้ง ด้วยdouble
,4
ไม่ตรงกับประเภทโดยตรงdouble
, ดังนั้นจึงควรใช้งานเกินพิกัดที่สอง