我有一个重载的模板函数:
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 会如此,然后确定还有哪些其他类型?
答案 0 :(得分:25)
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>
都是可行的。
但是,两者都不是更好的匹配方式,也不是更专业的匹配方式,因此通话内容不明确。