template<typename T> 和 template<class T>
一般情况下,这两个是通用的,也就是在一般情况下是typename 和 class是没有区别的,使用typename或者class只是编码风格的问题。
但是,有一个情况例外,就是在遇到从属类型(dependent type)的时候,为了避免潜在的预防解析二义性,必须用typename而不能用class,换句话说就是当 T 是一个类,而这个类又有子类(假设名为 innerClass) 时,应该用 template<typename>:
C++ 里,要访问名字空间中从属的名字,使用的是 NameSpace::NestName
。
Container::const_iterator *cit;
以上代码有两种解释:
1.声明一个Container::const_iterator
类型的指针变量 cit
。那么const_iterator
是 Container
里声明的类型。
2.const_iterator
是 Container
里的一个静态变量,而 cit
是另一个变量。那么这个语句的意思是这两个变量相乘。
如果 C++ 不允许从属类型名和静态变量名字重名,这样的话好像就可以通过解析类型的定义来确定从属名字是从属类型名还是静态变量名。但是,在使用模板编程时,这会导致很大的混乱。当类名字是一个模板参数,可能导致某些展开产生一个声明,另一些展开产生一个乘法。这种程度的变化,已经不能称作是多态,而是一种可怕的混沌。
所以,C++ 中采取的办法是,当类从属名称指向一个从属类型名时,在前面加上 typename
关键字;而不加这个关键字,则认为是静态变量。
例如,typename Container::iterator
是一个类型名,Time::Second
是静态变量。
所以
typename T::innerClass myInnerObject;
这里的 typename 告诉编译器,T::innerClass 是一个类,程序要声明一个 T::innerClass 类的对象,而不是声明 T 的静态成员,如果把 typename 如果换成 class 则会导致语法错误。