C++ typename关键字

C++中typename关键字

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

 

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

例如:

  1. 代替class关键字

    template < typename T >

    这里typenameclass关键字的功能一样,是为了取代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 }

 

posted on 2019-05-20 19:43  Duacai  阅读(2351)  评论(0编辑  收藏  举报