您的位置:首页 > 编程语言 > C语言/C++

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

2013-05-30 10:09 239 查看
显示模板实参:

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

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++ 显示模板实参
相关文章推荐