: 在模板参数表中,关键字 class 和 typename 的意义相同。
: C++标准引入 typename 关键字是因为有时必须要靠它来指导
: 编译器解释模板定义。
: 因此你可以认为这两个关键字在这里是等价的。
                          ~~~~~~~~~~~~~~~~仅在类型参数列表时候等价
typename 引入的初衷是用在区别是类型还是静态成员变量
如:someclass::joke
如果没有typename 修饰,就无法知道joke是类型还是静态成员变量
如果someclass中出现 typedef char* joke
则一定要typename指明。这才是typename的关键。

  --------------------------------------------------------------

C++ iso标准里面提供了一个typename的关键字,在template中的使用特别广泛,
希望你看了这篇文章能对它有所了解。

先看下面这个模板函数:
template<class T>
void f(T t){
  T::X();
}
根据你的经验,你能确定出X的定义是什么吗?显然可以有不止一种定义,在这里X可能
是T的一个内部类,
T::X()调的是构造函数,另外X也有可能是T的static function,那编译器在instantia
te时会怎么做?
如果使用typename关键字,写成这样:
template<class T>
void f(T t){
  typename T::X x;
}
可以明确告诉编译器X是个类型,从而避免让编译器解释X为一个static function而导致
生成一个语法错误。
下面是个完整的小例子,请用gcc编译(3.0最好),VC(6.0)在模板方面的表现很多人已经
批评过了:),VC7.0我还还没用过。
class A{
public:
 class X{};        //一个内部类X
 static void X();  //一个静态函数X()
};
void A::X(){};
template<class T>
void f(T t){
  typename T::X x; //如果去掉typename,按照C++规定,编译器会把T::X认为是静态
                   //函数而不是一个类型,从而产生一个编译错误。
};
void main()
{
 A a;
 f<A>(a);
}
另外,在声明时typename和class没有区别,下面两种都可以。
template<class T> void func(T t){}
template<typename T> void func(T t){} 

posted on 2011-10-07 17:33  罗鹏  阅读(417)  评论(0编辑  收藏  举报