当前位置:编程学习 > C/C++ >>

第16章 模板与泛型编程(3)

16.1.3 模板类型形参

类型形参由关键字class或typename后接说明符构成。在模板形参表中,这两个关键字具有相同的含义,都指出后面所接的名字表示一个类型。

模板类型形参可作为类型说明符用在模板中的任何地方,与内置类型说明符或类类型说明符的使用方式完全相同。具体而言,它可以用于指定返回类型或函数形参类型,以及在函数体中用于变量声明或强制类型转换。


template<class T> 
T &Method1(const T &t) 

    T &t1=t; 
    return t1; 

template<class T>
T &Method1(const T &t)
{
 T &t1=t;
 return t1;
}1. typename与class的区别

在函数模板形参表中,关键字typename和class具有相同含义,可以互换使用,两个关键字都可以在同一模板形参表中使用。

关键字typename是作为标准C++的组成部分加入到C++中的,因此旧的程序更有可能只用关键字class。

2. 在模板定义内部指定类型

template<class T> 
int Method2(T &t) 

    T::size_type p=T::size_type(10); 
    p+=10; 
    return p; 

template<class T>
int Method2(T &t)
{
 T::size_type p=T::size_type(10);
 p+=10;
 return p;
}
vector<int> vec; 
cout<<Method2(vec)<<endl; 
 vector<int> vec;
 cout<<Method2(vec)<<endl;我们不知道size_type是一个类型成员名字还是一个数据成员的名字,默认情况下,编译器假定这样的名字指定数据成员而不是类型。

如果希望编译器将size_type当作类型,则必须显式告诉编译器这样做。

通过在成员前加上关键字typename作为前缀,可以告诉编译器将成员当作类型。当然,这一声明给实例化模板函数增加了一个职责:那些类型必须具有名为size_type的成员,而且该成员是一个类型。

如果拿不准是否需要以typename指明一个名字是一个类型,那么指定它是个好主意。在类型之前指定typename没有害处,因此,即使typename是不必要的,也没有关系。

template<class T> 
int Method2(T &t) 

    typename T::size_type p=T::size_type(10); 
    p+=10; 
    return p; 

 摘自 xufei96的专栏
 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,