1、在模板定义中,定义模板参数类型,表明模板参数是一个类型参数;这里,typename作用和class相同;
用法:template<typename T> / template<class T>
2、声明类型:告诉编译器value_type是个类型,而不是变量名;
eg:typename Iterator::value_type tmp;
3、不能使用的场景:因为这些场景中,编译器知道需要的是类型还是变量。
A)模板定义外;
B)基类列表;基类列表里肯定是类型名,
template<class T>
class Derived: public Base<T>::fun{}
C)构造函数的初始化列表.初始化列表里肯定是成员变量名
Derived(int x) : Base<T>::var(x){}