显示模板实参:
模板实参被显示指定在逗号分隔的列表中,用尖括号(<>,一个小于号和一个大于号)括起来,紧跟在函数模板实例的名字之后。例如:
min<unsigned int>(ui,1024) ;//显示指定了函数的参数类型是<unsigned int>,1024是int类型,会转成<unsigned int>
就函数模板而言,以下两种情况必须指定template参数
1、当参数推演失败时,例如:
template<class T> T min(T,T) ; //模板函数声明
unsigned int ui ;
int main()
{
//错误:不能实例化min(unsigned int,int)
//必须是min(unsigned int,unsigned int)或
//min(int,int)
min(ui,1024) ;
}
min的函数实参必须类型相同(要么都是int,要么都是unsigned int),这时因为模板参数T必须被绑定在一个类型上。从第一个函数实参推演的出的T的模板实参是unsigned
int,从第二个函数实参推演出的是int。因为对于两个函数实参,模板实参T的类型被推演成不同类型,所以模板实参推演失败,并且模板实例化也会出错误。那么这时就应该使用显示模板实参。
min<unsigned int>(ui,1024) ;
2、当编译器无法推演返回类型时,例如:
template<class T1,class T2,class T3>
T1 sum(T2,op1,T3,op2)
{
/*.....*/
}
void mainpulate(int (*pf)(int,char)) ;
void mainpulate(double(*pf)(float,float)) ;
int main()
{
//错误:哪一个sum的实例?
//int sum(int,char)还是
//double sum(float,float) ?
mainpulate(&sum) ;
}
这时应该使用显示实参类型:
//取实例:double sum(float,float)的地址
//调用:void mainpulate(double(*pf)(float,float))
mainpulate(&sum<double,float,float>) ;
上述两种情况下,必须使用显示模板实参。
本文详细解释了在C++中使用模板实参的原因和规则,包括参数推演失败和无法推导返回类型时的解决方法,通过具体例子展示如何正确应用模板实参以避免编译错误。
758

被折叠的 条评论
为什么被折叠?



