在C++里,不管是模板函数,还是模板类,均会用关键字typename和class来指定模板类型。对于模板函数与模板类的使用请自行参考:C++ Primer中文版 。
但是为什么要用两个关键字呢,一个不就可以了吗?反正都是用来作为指定某变量的类型要在编译的时候才会被确定。
根据我查阅的资料,注释内容 typename和class的区分 与 C++箴言:理解typename的两个含义 猜测在早起模板里是使用class作为关键字,但是后来发现会导致后面介绍的问题,于是引入typename(仅是我胡乱猜测~),但是为什么不把class作为模板关键字的作用取消呢,保留typename为唯一的。下面摘自参考资料1处:
置信进修C++的人对class这个关键字都十分明确,class用于界说类。在模板引进c++后,最后界说模板的办法为:
template<class T>......
在这里class关键字标明T是一个范例,后面为了不class在这两个地方的运用能够给人带来混淆,以是引进了typename这个关键字。它的效果同class同样标明后边的标记为一个范例,如许在界说模板的时分就能够运用下面的方法了:
template<typename T>......
在模板界说语法中关键字class与typename的效果彻底同样。typename莫非仅仅在模板界说中起效果吗?实在不是如许,typename别的一个效果为:运用嵌套依托范例(nested depended name),以下所示:
class MyArray
{
public:
typedef int LengthType;
//.....
}
template<class T>
void MyMethod( T myarr )
{
typedef typename T::LengthType LengthType;
LengthType length = myarr.GetLength;
}
这个时候typename的作用就是告诉c++编译器,typename后面的字符串为一个类型名称,而不是成员函数或者成员变量,这个时候如果前面没有typename,编译器没有任何办法知道T::LengthType是一个类型还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。
更多详细介绍参考资料1。
参考资料:
1、理解typename的两个含义
2、注释内容 typename和class的区分
3、C++ Primer中文版