关键字typename 被用来作为型别之前的标识符号。
template <class T>型别的指针
class MyClass {
typename T::SubType * ptr;
...
};
这里,typename 指出SubType 是 class T 中定义的一个型别,因此prt是一个指向T::SubType型别的指针。如果没有关键字typename,SubType会被当成一个static成员:
T::SubType * ptr;
会被解释为型别T内的数值 SubType与prt的乘积。
SubType成为一个型别的条件是,任何一个用来取代T的型别,其内都必须提供一个内部型别(inner type)SubType 的定义。例如, 将型别Q当作template参数:
MyClass<Q> x;
必要条件是型别Q有如下的内部定义:
class Q {
typedef int SubType; //typedef class SubType;
...
};
注意,如果要把一个template中的某个标识符号指定为一种型别,就算意图显而易见,关键字typename也不可或缺,因此C++的一般规则是, 除了以typename修饰之外,template内的任何标识符号都被视为一个值而非一个型别。
所以了,可以用模板的参数来传递数值的 MyClass<3> x; 是完全可以的!
关于初始化:
int i1; // 0
int i2 = int(); // 0
template<class T>
void f()
{
T x = T(); // 初始化为0
...
}
注意:目前template必须定义在头文件中,为了消除这个限制,标准规格导入了一个template compilation model 和一个关键词 export 。目前很少有编译器支持。。。。