我对模板类型推导有误解:),因为我不知道下面的示例代码是如何工作的:
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);
我会
double int double
(T1将推导为int,T2将推导为double和返回类型double)。int int double
(RT将被推导为int,T1将推导为int,T2将推翻为double)。正如我所知,在类型推导后没有类型转换,因此从签名中我可以说第二个功能是候选。
关于这两个函数如何成为模板参数int候选者的任何线索?
谢谢
答案 0 :(得分:2)
当您将类型作为参数传递时,则不会推导该参数。想一想,这会引起各种各样的意外情况。因此,对于
::max<int>(4, 7.2);
这两个候选者分别来自第一个重载的max<int,double>
和第二个重载的max<int,int,double>
,根据其签名相同(两者分别为int
和double
作为参数)。