C++ typename关键字
C++中typename关键字
下面是摘自https://zh.cppreference.com/w/cpp/keyword/typename的描述
C++中的typename关键字常见于模板使用
例如:
1. 代替class关键字
template < typename T >
这里typename和class关键字的功能一样,是为了取代class关键字而生,原因是class用来代表非类类型时有点歧义,例如用class代表struct类型、int、double类型,这样显得不伦不类。
2. 在模板中获取变量类型
这个功能在C++标准库的萃取器里面经常出现
示例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:
template < typename T >
class A {
public:
typedef int val_type;
}
typename A<T>::val_type 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 }