amp*_*ier 20 c++ templates template-argument-deduction c++17 visual-studio-2019
我有一个重载的模板函数:
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;
}
Run Code Online (Sandbox Code Playgroud)
如果我这样称呼它:
auto a = overMax(4, 7.2); // uses first template
auto b = overMax<double>(4, 7.2); // uses second template
Run Code Online (Sandbox Code Playgroud)
一切都很完美,但是
auto c = overMax<int>(4, 7.2); // error
Run Code Online (Sandbox Code Playgroud)
导致模棱两可的调用。
为什么int是这样,还有哪些其他类型?
Jar*_*d42 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>是可行的。
但两者都不是更好的匹配或更专业,所以调用是模棱两可的。