显式模板实参
一.在一些情况下编译器不可能推演出模板的实参的类型。如果模板实参推演过程为同一模板实参推演
出两个不同的类型,则编译器会给出一个错误,支持模板实参推演失败。
这种情况下,我们需要改变模板实参推演机制,并使用显式指定,模板实参被显式指定在逗号的列
表中,用尖括号括起来。
#include<iostream>
template <class T>
T min5(T,T){return T;}
unsigned int ui;
int main()
{
//min5(ui,12); //错误 ,同一个模板两个不同类型参数,必须使用显式模板实参如下:
min5<unsigned int>(ui,12);//此时模板实例化的函数是:min5(unsigned int,unsigned int)
return 0;
}
分析:
1.显式模板实参min5<unsigned int>(ui,12) 参数类型被固定为unsigned.不需要推演模板实参了,且
实例化后,int型的“12” 可以通过有序标准转换成类型unsigned int(隐式类型转换).
2.调用min5(ui,12);时,模板必须经过推演模板实参,推演ui时就确认了模板类型为min5(unsigned int,unsigned int);
但是int型“12”,不是unsigned int ,所以程序不会通过转型,直接提示参数类型不一致。
显式模板参数还为其他的程序设计问题提供了方案。
template <class T1, class T2, class T3>
T1 sum(T2, T3);
typedef unsigned int ui_type;
ui_type calc(char ch,ui_type ui){
ui_type loc1=sum(ch,ui);//错误:T1不能被推演处理。
//模板实参被显式指定
ui_type loc2=sum<ui_type,char,ui_type>(ch,ui);//实例化 ui_type sum(ui_type,char,ui_type)
//T2,T3通过推演(即省略了尾部参数),返回类型T1通过指定ui_type
ui_type loc3=sum<ui_type>(ch,ui);//实例化 ui_type sum(ui_type,char,ui_type)
//注意:只能通过省略模板参数列表的尾部参数。
ui_type loc4=sum<ui_type, ,ui_type>(ch,ui);//错误:模板推演不出来参数,只能省略模板参数列表尾部。
}
int main(){
return 0;
}
//sum()实例地址被取出,并作为manipulate()调用的实参被传递。
#include<iostream>
template <class T1,class T2,class T3>
T1 sum(T2 op1,T3 op2){
T1 a;
return a;
}
void manipulate(int (*pf)(int,char) ){}
void manipulate(double (*pf)(float,float) ){}
int main()
{
manipulate(&sum);//错误:产生二义性
manipulate(&sum<double,float,float>);//显式指定了实例double sum(float,float);
return 0;
}
显式模板实参应该只被用于解决二义性,或者模板实参不能推演出来上下文中使用模板实例。
建议在可能的时候省略显示模板实参。
posted on 2010-02-05 15:59
jasper 阅读(360)
评论(0) 编辑 收藏 引用 所属分类:
c++学习