问题描述
#include <iostream>
#include <type_traits>
template<typename T1,typename T2>
auto max(T1 t1,T2 t2)
{
return t1 < t2 ? t2 : t1;
}
template<typename RT,typename T1,typename T2>
RT max (T1 a,T2 b)
{
return b < a ? a : b;
}
int main()
max<long double>(4.5,4);
max<double>(4.5,4);
return 0;
}
解决方法
给出max<long double>(4.5,4);
,对于第一个max
,其第一个模板参数T1
指定为long double
,T2
从4
推导为int
。对于第二个max
RT
指定为long double
,将T1
推导为double
,将T2
推导为int
。然后第二个就赢得了过载解析,因为它是完全匹配的,而第一个则需要从double
到long double
的隐式转换。
另一方面,给定max<double>(4.5,4);
,对于第一个max
T1
被指定为double
,T2
被推导为int
。对于第二个max
RT
指定为double
,将T1
推导为double
,将T2
推导为int
。他们都是完全匹配。