在C++模板使用中,通常会用到<typename T>和<class T>两种方式来标识T参数的类型,二者是可以互换的,其主要差别是在含有嵌套从属类型名称(指代码中的某些类型存在依赖关系,比如某些类型需要依赖于参数T)时,需要考虑前缀typename::,否则C++解析时未必会将之后的字符串当做一个类型,或者会将其看做一个变量名称等,例如:
template<typename C> void print(C& container) { C::const_iterator* x; }
上述代码中C::c onst_iterator未必会被编译器当做一个类型看待,为了避免这种歧义,需要添加前缀词typename:
typename C::const_iterator* x;
但是对不同的编译器,对typename具体的处理方式也有所不同,所以有可能会带来移植方面的小麻烦。
以上整理自Effective C++中文版第三版 case 42.