c ++模板-多个重载函数实例与参数列表匹配

问题描述

为什么只有最后一次调用max会引发错误

错误C2668:“ max”:对重载函数的模棱两可的调用

#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 doubleT24推导为int。对于第二个max RT指定为long double,将T1推导为double,将T2推导为int。然后第二个就赢得了过载解析,因为它是完全匹配的,而第一个则需要从doublelong double的隐式转换。

另一方面,给定max<double>(4.5,4);,对于第一个max T1被指定为doubleT2被推导为int 。对于第二个max RT指定为double,将T1推导为double,将T2推导为int。他们都是完全匹配。