重点知识

1. 函数模板**不允许自动转换**,普通函数**可以进行自动类型转换**
2. 函数模板可以像普通函数一样被**重载**
3. C++编译器**优先考虑调用普通函数**
4. 如果函数模板可以**产生一个更好的匹配**,则选择模板函数
5. 可以通过**空模板实参列表**的语法限定编译器只调用模板函数

示例说明

#include<iostream>
using namespace std;

//普通函数和模板函数  函数名相同  形成函数重载

int myswap(int a, int b)
{
    cout << "调用普通函数!!!" << endl;
    return 0;
}

template <typename T>
T  myswap(T a, T b)
{
    cout << "调用2个参数 模板函数!!!" << endl;
    return 0;
}

template <typename T>
T  myswap(T a, T b, T c)
{
    cout << "调用3个参数 模板函数!!!" << endl;
    return 0;
}
int main()
{
    int a = 1;
    char c = 'z'; 
    myswap(a,a);       //优先考虑普通函数,匹配成功
    myswap<>(a,a);     //指定使用函数模板,使用空模板实参列表的语法,即 <>
    myswap(c,a);       //普通函数调用,进行隐式类型转换

    myswap(3.0, 4.0);  //调用函数模板可以产生一个更好的匹配,使用函数模板,而普通函数参数是int型
    myswap(3.0, 4.0, 4.0);   //函数重载,3个参数版本
	
}