首页 > 解决方案 > 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;
}

标签: c++templatesoverloading

解决方案


给定max<long double>(4.5, 4);,对于第一个,max它的第一个模板参数T1被指定为long double,从asT2推导出来。对于第二个被指定为,被推导为并且被推导为。然后第二个在重载决议中获胜,因为它是完全匹配的,而第一个需要从to隐式转换。4intmax RTlong doubleT1doubleT2intdoublelong double

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


推荐阅读