加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++函数或函数模板的匹配顺序

发布时间:2020-12-16 07:41:33 所属栏目:百科 来源:网络整理
导读:函数模板可以重载,只要它们的形参表不同即可。例如,下面两个模板可以同时存在: template class T1,class T2void print(Tl arg1,T2 arg2 ){ cout arg1 " " arg2 endl;}template class Tvoid print(T arg1,T arg2){ cout arg1 " " arg2 endl;} 在有多个函数
函数模板可以重载,只要它们的形参表不同即可。例如,下面两个模板可以同时存在:
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++ 编译器遵循以下先后顺序:
  1. 先找参数完全匹配的普通函数(非由模板实例化得到的函数)。
  2. 再找参数完全匹配的模板函数。
  3. 再找实参经过自动类型转换后能够匹配的普通函数。
  4. 如果上面的都找不到,则报错。

例如下面的程序:
#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 类型后调用后者呢?这是有二义性的,因此编译器会报错。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读