c++ - 模板函数重载
问题描述
我对模板类型推导有一个误解:) 因为我无法弄清楚下面的示例代码是如何工作的:
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);
我将拥有
- 模板化 Fct 1 签名
double int double
(T1 将推导出为 int,T2 为 double 和返回类型 double)。 - 模板化 Fct 2 签名
int int double
(RT 将推导出为 int,T1 为 int,T2 为 double)。
据我所知,在类型推断之后没有类型转换,所以从签名中我会说第二个函数是候选函数。
关于这两个函数如何成为模板参数 int 的候选者的任何线索?
谢谢
解决方案
当您将类型作为参数传递时,将不会推导出参数。想一想,这会引起各种意想不到的事情。因此,对于
::max<int>(4, 7.2);
这两个候选者max<int,double>
来自第一个重载和max<int,int,double>
第二个,根据它们的签名是相同的(都采用 anint
和 adouble
作为参数)。
推荐阅读
- fpga - 如何更改 AXI Traffic Generator 3.0 生成的事务数
- javascript - Angular:使用导航器以编程方式将多个 y 轴添加到 highstock
- ios - 长时间运行的异步任务 - 如何在用户可能导航到的任何视图控制器中接收回调
- c# - 如何在 C# 中识别损坏的 tiff 文件?
- ios - 解码 .utf8 可能不能在 swift 中正常工作吗?
- sql - FOR XML 列名称“Value/@json:ValueType”缺少 XML 名称空间前缀“json”声明
- python - 为什么 azure-sdk-for-python 返回对象
- intellij-idea - 如何在评论后阻止 CLion 双重缩进?
- java - 如何在按钮上方制作视图(最小 SDK:17)
- javascript - DOM 事件 API JavaScript