과부하 된 템플릿 기능이 있습니다 :
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 이고, 다른 유형은 무엇입니까?
답변
RT
공제 할 수 없으므로 제공하지 않을 경우에만 template<typename T1, typename T2>
호출 할 수 있습니다.
auto overMax(T1 a, T2 b)
하나의 템플릿 인수를 (부분적으로) 제공하면 두 방법 모두 실행 가능합니다.
그러나 논쟁에 따라 더 나은 후보가 될 수 있습니다.
-
에 대한
auto b = overMax<double>(4, 7.2); // uses second template
모두
overMax<double, int, double>
와overMax<double, double>
가능한 있습니다.
그러나overMax<double, int, double>
정확히 일치
하는 반면 변환이overMax<double, double>
필요int
합니다double
. -
에 대한
auto c = overMax<int>(4, 7.2); // Ambiguous call
모두
overMax<int, int, double>
와overMax<int, double>
가능한 있습니다.
그러나 더 잘 어울리거나 더 전문적이지 않으므로 전화가 모호합니다.