为什么普通函数在那里不调用?

时间:2021-01-22 18:28:53

标签: c++

我们知道,当我们在模板函数中用普通函数进行函数重载时,如果编译器与普通函数fun()完全匹配,它将调用普通fun()并忽略模板fun() . 但是在下面的 C++ 代码中,当我运行代码时,它调用的是模板函数而不是普通函数。 为什么?

代码

#include<iostream>
using namespace std;

template<class T1, class T2>
void fun(T1 x, T2 y){
    cout << "TEMPLATE FUNCTION : " << x << " | " << y << endl;
}

void fun(int a, float b){
    cout << "ORDINARY FUNCTION : " << a << " | " << b << endl;
}

int main(){
    fun(3, 4.7);
    return 0;
}

输出

TEMPLATE FUNCTION : 3 | 4.7

2 个答案:

答案 0 :(得分:4)

在这次通话中:

fun(3, 4.7);

第二个参数 4.7 是一个 double。正如您在问题中提到的,只有当参数是 exact 匹配时,才会调用非模板函数。由于非模板函数需要将 float 作为第二个参数,因此需要从 double 转换为 float。这不是完全匹配,因此选择了模板。

如果您希望选择非模板,则传递一个 float 作为第二个参数:

fun(3, 4.7f);

答案 1 :(得分:2)

在这种情况下,模板函数是通用的,实际上意味着它们可以接受不止一种预定义的数据类型。由于 fun 的参数包含 double,因此默认为模板函数 fun。将参数更改为 float 后,它应该会正确调用普通函数。