温带函数重载

时间:2018-11-09 17:13:44

标签: c++ templates overloading

我对模板类型推导有误解:),因为我不知道下面的示例代码是如何工作的:

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); 我会

  • 模拟的Fct 1签名 double int double(T1将推导为int,T2将推导为double和返回类型double)。
  • 模拟的Fct 2签名 int int double(RT将被推导为int,T1将推导为int,T2将推翻为double)。

正如我所知,在类型推导后没有类型转换,因此从签名中我可以说第二个功能是候选。

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

谢谢

1 个答案:

答案 0 :(得分:2)

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

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

这两个候选者分别来自第一个重载的max<int,double>和第二个重载的max<int,int,double>,根据其签名相同(两者分别为intdouble作为参数)。