当模板函数与普通函数发生重载的时候:
普通函数的调用:可以进行隐式的类型转换
调用模板函数:本质是类型参数化。将严格的按照类型进行匹配,不会进行自动类型转换。
所以在模板函数与普通函数发生重载的时候,先看实参与形参是否严格对应,对应之后才可以直接调用模板函数,否则将在普通函数中直接进行隐式类型转换。
具体来说:
函数模板不允许自动类型转化
普通函数可以进行自动类型转化
1.函数模板可以像普通函数一样重载
2.c++编译器优先考虑普通函数
3.如果函数模板可以产生一个更好的匹配,那么选择模板
4.可以通过空模板实参列表的语法限定编译器只通过模板匹配
#include<iostream> using namespace std; template <typename T> void myswap(T& a, T& b)//T相同要求函数的形参和实参类型要相同 { T c; c = a; a = b; b = c; cout << "模板调用" << endl; } //重载 void myswap(int a, char c) { cout << "a: " << a << " c: " << c << "普通函数" << endl; } int main() { int a = 10; char c = 'z'; myswap(a, c);//普通函数的调用:可以进行隐式的类型转换 myswap(c, a);//普通函数的调用:可以进行隐式的类型转换 myswap(a, a);//调用模板函数:本质是类型参数化。将严格的按照类型进行匹配,不会进行自动类型转换 system("pause"); return 0; }
运行结果: