首页 > 解决方案 > 模板函数重载

问题描述

我对模板类型推导有一个误解:) 因为我无法弄清楚下面的示例代码是如何工作的:

template<typename T1, typename T2>
auto max(T1 a, T2 b)
{
    return  b < a ? a : b;
}

template<typename RT, typename T1, typename T2>
RT max(T1 a, T2 b)
{
    return  b < a ? a : b;
}


int main()
{
    auto c = ::max<int>(4, 7.2);
}

所以总的来说,我有一个错误说分辨率是模棱两可的,因为这两个模板 fcts 是候选的。

到目前为止,我所理解的(并且希望是正确的)来自::max<int>(4, 7.2); 我将拥有

据我所知,在类型推断之后没有类型转换,所以从签名中我会说第二个函数是候选函数。

关于这两个函数如何成为模板参数 int 的候选者的任何线索?

谢谢

标签: c++templatesoverloading

解决方案


当您将类型作为参数传递时,将不会推导出参数。想一想,这会引起各种意想不到的事情。因此,对于

::max<int>(4, 7.2);

这两个候选者max<int,double>来自第一个重载和max<int,int,double>第二个,根据它们的签名是相同的(都采用 anint和 adouble作为参数)。


推荐阅读