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++函数或函数模板的匹配顺序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)