C++函数或函数模板的匹配顺序
函数模板可以重载,只要它们的形参表不同即可。例如,下面两个模板可以同时存在:
例如下面的程序:
Function Max
Template Max 1
Template Max 2
如果把程序中的 Max 函数和第二个 Max 模板都去掉,按照上面所说的 4 条匹配规则,第 23 行的
template <class T1, class T2> void print(Tl arg1, T2 arg2 ) { cout << arg1 << " " << arg2 << endl; } template <class T> void print(T arg1, T arg2) { cout << arg1 << " " << arg2 << endl; }在有多个函数和函数模板名字相同的情况下,一条函数调用语句到底应该被匹配成对哪个函数或哪个模板的调用呢? 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 类型后调用后者呢?这是有二义性的,因此编译器会报错。所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算