关键字 typename
template <typename T>
class MyClass{
typename T::SubType * ptr;
};
在这里第二个typename关键字的意思是:SubType是class T内部定义的一个型别
从而ptr是一个指向T::SubType型别的指针;
如果上例没有使用关键字typename,SubType会被认为是class T的一个static成员
于是被编译器理解为一个具体变数或一个物件,导致下面式子:
T::SubType * ptr;
所表达的意义变成了:class T的static成员SubType与ptr相乘
通常与某个template parameter相关的名称是个型别时,就必须加上关键字typename
一般比较常见的是STL容器供应的迭代器
如下代码:
template <typename T>
void printcoll(T const &coll){
typename T::const_iterator pos;
typename T::const_iterator end(coll.end());
for(pos = coll.begin;pos!=end ; ++pos){
std::cout<< *pos <<" ";
}
std::cout << std::endl;
}