C++函数或函数模板的匹配顺序
2023-06-13 09:11:55 时间
}
#include iostream using namespace std; template class T T Max(T a, T b) cout Template Max 1 endl; return 0; template class T, class T2 T Max(T a, T2 b) cout Template Max 2 endl; return 0; double Max(double a, double b) { cout Function Max endl; return 0; int main() { int i = 4, j = 5; Max(1.2, 3.4); //调用 Max 函数 Max(i, j); //调用第一个Max模板生成的函数 Max(1.2, 3); //调用第二个Max模板生成的函数 return 0; }
在有多个函数和函数模板名字相同的情况下,一条函数调用语句到底应该被匹配成对哪个函数或哪个模板的调用呢? C++ 编译器遵循以下先后顺序:
#include iostream using namespace std; template class T T Max(T a, T b) cout Template Max 1 endl; return 0; template class T, class T2 T Max(T a, T2 b) cout Template Max 2 endl; return 0; double Max(double a, double b) { cout Function Max endl; return 0; int main() { int i = 4, j = 5; Max(1.2, 3.4); //调用 Max 函数 Max(i, j); //调用第一个Max模板生成的函数 Max(1.2, 3); //调用第二个Max模板生成的函数 return 0; }
程序的输出结果是:
Function Max
Template Max 1
Template Max 2
如果把程序中的 Max 函数和第二个 Max 模板都去掉,按照上面所说的 4 条匹配规则,第 23 行的Max(1.2, 3);编译时就会出错。因为从第一个 Max 模板没法生成与之类型完全匹配的模板函数 Max(double, int)。虽然从该 Max 模板可以生成 int Max( int, int) 和 double Max( double, doube),但是到底应该把 1.2 自动转换成 int 类型后调用前者,还是应该把 3 自动转换成 double 类型后调用后者呢?这是有二义性的,因此编译器会报错。
21598.html
chtml相关文章
- EasyC++40,模板重载
- C++字符串加密_c++字符串连接函数
- c++的链表-C++链表
- C/C++ 实现简易特征码扫描器
- 【C++初阶】函数模板与类模板
- c++模板
- 【C++ 语言】面向对象 ( 模板编程 | 函数模板 | 类模板 )
- 【C++】模板初阶
- 【C++】反向迭代器
- 【C++】模板进阶
- C++类模板案例-构建自己的通用数组
- c++ 类模板函数模板的问题,模板函数不能是虚函数,虚函数不能是内联详解编程语言
- C++类模板(模板类)详解
- C++ tuple(STL tuple)模板用法详解
- C#调用C++版本dll时的类型转换需要注意的问题小结
- 深入分析:C++模板究竟会使代码膨胀吗
- C++中“#”号的使用技巧
- C++代码规范之命名规则
- C++标准模板库函数sort的那些事儿
- C++写注册表项实例
- C++namespace相关语法实例分析
- C++输入输出注意事项总结