说明:本文转自 http://blog.csdn.net/csfreebird/article/details/1100383
定义:从函数实参确定模板实参的类型和值的过程叫做模板实参推断 《C++ Primer 4th》
举例
template<class Glorp>//模板类型形参
int compare(const Glorp& v1,const Glorp& v2)//函数形参
{
if(v1<v2)
{
return -1;
}
if(v2<v1)
{
return 1;
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
compare(1,0);//未显式指定模板参数类型,所以参数推导机制起作用
compare(3.14,2.7);
return 0;
}
模板实参推断的规则:
1)如果某个函数的多个形参的类型是同一个模板类型形参,推断出来的函数的这些实参类型要完全匹配
以下调用代码会导致如下错误:
Error 1 error C2782: 'int compare(const Glorp &,const Glorp &)' : template parameter 'Glorp' is ambiguous
short i=0;
int j=3;
compare(i,j);
2)如果模板函数的形参是非引用类型,忽略const
以下调用代码正确:
template<class A>
void Fobj(A a)
{
cout<<a<<endl;
}
nt _tmain(int argc, _TCHAR* argv[])
{
const int x=9;
Fobj(x);
return 0;
}
3)形参如果是const 引用或者指针,实参可以使非const引用或者指针,编译器会自动转换到const
4)非引用类型模板形参可以将数组或函数类型的实参转换成数组指针或函数指针
5)引用类型模板形参不能将将数组或函数类型的实参转换成数组指针或函数指针,参数推导将出错
6)可以根据函数指针推断模板实参
例如:
template <typename T> int compare (const T& ,const T&);
int (*pf1) (const int&,const int&)=compare;
7)模板实参推断顺序是从函数返回值开始,从左至右逐一推导
8)为防止推导失败,可以在调用函数时显式指定模板参数类型