- 普通函数调用时可以发生自动类型转换(隐式类型转换)
- 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
- 如果利用显示指定类型的方式,可以发生隐式类型转换
#include2、普通函数与函数模板的调用规则using namespace std; //普通函数 int myAdd01(int a, int b) { return a + b; } //函数模板 template T myAdd02(T a, T b) { return a + b; } int main() { int a = 10, b = 20; char c = 'c'; //传入函数的参数类型不一致 cout << myAdd01(a, c) << endl;//普通函数自动隐式类型转换 //cout << myAdd02(a, c) << endl; 函数模板自动类型转换失败 //告诉编译器,给我转成int类型,能转就转,不能转给我报错 cout << myAdd02 (a, c) << endl; //函数模板,如果用显示指定类型,可以发生隐式类型转换 return 0; }
调用规则如下:
- 如果函数模板和普通函数都可以实现,优先调用普通函数
- 可以通过空模板参数列表来强制调用函数模板
- 函数模板也可以发生重载
- 如果函数模板可以产生更好的匹配,优先调用函数模板
#includeusing namespace std; //编译器允许普通函数和函数模板同时存在 void print01(int a,int b) { cout << "普通函数的调用" << endl; } template void print01(T a, T b) { cout << "函数模板的调用" << endl; } template void print01(T a, T b, T c) { cout << "函数模板的重载" << endl; } int main() { int a = 1; int b = 2; int c = 3; print01(a,b); //如果函数模板和普通函数都可以实现,优先调用普通函数 print01<>(a, b);//可以通过空模板参数列表来强制调用函数模板 print01(a, b, c);//函数模板也可以发生重载 char d = 'd'; char e = 'e'; print01(d, e);//如果函数模板可以产生更好的匹配,优先调用函数模板 return 0; }
总结:
1、建议使用显示指定类型的方式,调用函数模板,因为可以自己确定通用类型T;
2、既然提供了函数模板,最好就不要提供普通函数,否则容易出现二义性,在实际开发中不要出现两个都存在的情况;



