【发布时间】:2020-05-02 06:10:37
【问题描述】:
我有一个重载的模板函数:
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为什么会这样,还有哪些其他类型呢?
【问题讨论】:
-
我认为.........编译器看到它的方式是:使用
int,您是指定typename RT还是typename T1?因为4也是int,它也可以是。对于double,4不直接匹配类型double,因此首选第二个重载。 -
这对我来说看起来有点狡猾,因为您在返回类型上有点重载,但模板具有不同数量的参数。
标签: c++ templates c++17 visual-studio-2019 template-argument-deduction