我们知道,当我们在模板函数中用普通函数进行函数重载时,如果编译器与普通函数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
答案 0 :(得分:4)
在这次通话中:
fun(3, 4.7);
第二个参数 4.7
是一个 double
。正如您在问题中提到的,只有当参数是 exact 匹配时,才会调用非模板函数。由于非模板函数需要将 float
作为第二个参数,因此需要从 double
转换为 float
。这不是完全匹配,因此选择了模板。
如果您希望选择非模板,则传递一个 float
作为第二个参数:
fun(3, 4.7f);
答案 1 :(得分:2)
在这种情况下,模板函数是通用的,实际上意味着它们可以接受不止一种预定义的数据类型。由于 fun
的参数包含 double
,因此默认为模板函数 fun
。将参数更改为 float 后,它应该会正确调用普通函数。