两种必须使用显示模板实参的情形

本文详细解释了在C++中使用模板实参的原因和规则,包括参数推演失败和无法推导返回类型时的解决方法,通过具体例子展示如何正确应用模板实参以避免编译错误。

显示模板实参:

       模板实参被显示指定在逗号分隔的列表中,用尖括号(<>,一个小于号和一个大于号)括起来,紧跟在函数模板实例的名字之后。例如:

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>) ;


上述两种情况下,必须使用显示模板实参。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值