posts - 0,  comments - 0,  trackbacks - 0
显式模板实参

一.在一些情况下编译器不可能推演出模板的实参的类型。如果模板实参推演过程为同一模板实参推演
出两个不同的类型,则编译器会给出一个错误,支持模板实参推演失败。
这种情况下,我们需要改变模板实参推演机制,并使用显式指定,模板实参被显式指定在逗号的列
表中,用尖括号括起来。
#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++学习

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理


<2026年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿

文章分类

文章档案

jasper

搜索

  •  

最新评论