下面是摘自https://zh.cppreference.com/w/cpp/keyword/typename的描述函数
C++中的typename关键字常见于模板使用spa
例如:code
1. 代替class关键字blog
template < typename T >继承
这里typename和class关键字的功能同样,是为了取代class关键字而生,缘由是class用来表明非类类型时有点歧义,例如用class表明struct类型、int、double类型,这样显得不三不四。作用域
2. 在模板中获取变量类型get
示例1:编译器
1 template <class T> 2 void foo() { 3 typename T::iterator * iter; // typename用于告诉编译器,T::iterator是一个类型而不是一个变量;不然编译器可能认为它是一个乘法操做 4 } 5 6 struct ContainsAType { 7 struct iterator; 8 }; 9 10 foo<ContainsAType>();
示例2:it
typename A<T>::k var; // var变量是A类里面的k变量的类型,这里等同于static int var;编译
const typename A<T>::B& func(); // func()返回值是const A做用域下B类的引用
typedef typename A<T>::B BType; // 给A做用域下的B类 类型取一个别名为BType
int func(typename A<T>::k var); // func函数的参数是A::k类型(static int)
template < typename T, typename Containter = std::deque<T> > class stack;
上面的四个例子已经表示typename至关于获取变量的类型
继承类的列表和参数初始化列表不能出现typename,由于编译器知道继承类的列表必须是类型,参数初始化列表必须是变量,例如:
1 template<class T> 2 class Derived: public Base<T>::XXX, public A<T>::YYY // 父类列表,绝对是类型不多是变量 3 { 4 ... 5 } 6 7 Derived(int x, int y) : Base<T>::XXX(x), A<T>::YYY(y) // 参数初始化列表,绝对是变量而不多是类型 8 { 9 ... 10 }