//求两个int值得最大值
inline int const& max(int const& a,int const& b)
{
return a<b?b:a;
}
//求两个任意类型值中的最大者
template<typename T>
inline T const& max(T const& a,T const& b)
{
return a<b?b:a;
}
//求3个任意类型值中的最大者
template<typename T>
inline T const& max(T const& a,T const& b,T const& c)
{
return ::max(::max(a,b),c);
}
int main()
{
::max(7,12,68); //调用具有3个参数的模板
::max('a','b'); //调用max<double>(通过实参演绎)
::max(7,42); //调用int重载的非模板函数
::max<>(7,42); //调用max<int>(通过实参演绎)
::max<double>(7,42); //调用max<double>(没有实参演绎)
::max('a',42.7); //调用int 重载的非模板函数
}
一个非模板函数可以和一个同名函数模板同时存在,而且该函数模板还可以实例化为这个非模板函数。
对于非模板函数和同名的函数模板如果其他条件都是相同的话,那么在调用的时候,重载解析过程通常会调用非模板函数,而不会从该模板产生出一个实例。
max(7,42) //使用两个int 值,很好地匹配非模板函数
模板时不允许自动类型转化的,但普通函数可以进行自动类型转化,所以最后一个调用将使用非模板函数
('a',42.7)//对于不同类型的参数,只允许使用非模板函数
当重载函数模板的时候,把你的改变限制在:显式地指定模板参数。
一定要让函数模板的所有重载版本的声明都位于它们被调用的位置之前。