C++里面模板函数怎么重载一个非模板函数 ?

C++里面模板函数怎么重载一个非模板函数,是根据返回值判断函数的重载调用的么?

//函数模板
template
T MyPlus(T a, T b){
T ret = a + b;
return ret;
}

//普通函数
int MyPlus(int a, int b){
int ret = a + b;
return ret;
}

void test03(){
int a = 10;
int b = 20;
char c = 'a';
char d = 'b';
//如果函数模板和普通函数都能匹配,c++编译器优先考虑普通函数
cout << MyPlus(a, b) << endl;
//如果我必须要调用函数模板,那么怎么办?
cout << MyPlus<>(a, b) << endl;
//此时普通函数也可以匹配,因为普通函数可以自动类型转换
//但是此时函数模板能够有更好的匹配
//如果函数模板可以产生一个更好的匹配,那么选择模板
cout << MyPlus(c,d);
}

//函数模板重载
template
T MyPlus(T a, T b, T c){
T ret = a + b + c;
return ret;
}

void test04(){

int a = 10;
int b = 20;
int c = 30;
cout << MyPlus(a, b, c) << endl;
//如果函数模板和普通函数都能匹配,c++编译器优先考虑普通函数

}

那么优先级和匹配怎么发生的?为什么函数模板可以和普通函数放在一起?c++编译器是如何实现函数模板机制的?

#include
using namespace std;

template
T MyPlus(T a,T b){
T ret = a + b;
return ret;
}

int main(){

int a = 10;
int b = 20;
MyPlus(a,b);

char c = 'a';
char d = 'b';
MyPlus(c,d);        

return 0;

}

通过上面的例子我们可以发现几点:
 编译器并不是把函数模板处理成能够处理任何类型的函数
 函数模板通过具体类型产生不同的函数
 编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编译。
编译器根据函数的调用情况,产生具体函数,这个具体函数根据类型产生。

关于函数的重载机制,是一个比较复杂的问题,其中涉及到了优先级定义和最佳匹配等问题,以下链接时几个大神的回答。
http://www.cnblogs.com/liyuan989/p/4138378.html