C++ typename关键字

C++中typename关键字

下面是摘自https://zh.cppreference.com/w/cpp/keyword/typename的描述函数

 

C++中的typename关键字常见于模板使用spa

例如:code

  1. 代替class关键字blog

    template < typename T >继承

    这里typenameclass关键字的功能同样,是为了取代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 }
相关文章
相关标签/搜索