第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++ ,