c++ - 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 double
,从asT2
推导出来。对于第二个被指定为,被推导为并且被推导为。然后第二个在重载决议中获胜,因为它是完全匹配的,而第一个需要从to隐式转换。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
。他们俩是完全匹配的。
推荐阅读
- generics - 如何使用子包/通用包实例化中的类型
- php - 使用 PHP PDO 和 MYSQL 不显示图像
- javascript - Javascript removeClass/toggleClass 适用于桌面,但不适用于响应式页面
- c++ - 有人安装“IITB Simplecpp in mac”吗?
- wordpress - 如何通过帖子 ID 获取帖子元及其分类和术语值
- javascript - 为 Webpack 的 babel-loader 配置 babelrc 位置?
- google-apps-script - 谷歌应用程序脚本可以用谷歌 API 完成吗?
- php - 我不理解将值保存在变量中的 php 表达式,下面是 php 行
- c - XV6 操作系统是用来做什么的?
- php - 如何创建查询以按表列mysql的总和进行过滤