zoukankan      html  css  js  c++  java
  • typename在C++中的用法

    1. //在C++中typename一般用来声明模板的模板参数(template parameter):
       template<typename T> class X;   //T是一个模板参数
       
    2. /*但是还有一个关键的用法。首先是两个概念:
       1). qualified name
           例如:std::cout, std::endl;这样含有作用域符号(::)的就是限定名,
           当我们用using声明将cout,endl引入到当前作用域之后就可以直接使用
           这两个名称,这个时候cout,endl就不是限定名了。
       2). dependent name
           dependent name是依赖于模板参数的类型,例如:*/
           template <typename T> class X 
           {
               int i;
               std::vector<int> ivec;
               std::vector<int>::iterator iter;
               
               T type;
               std::vector<T> tvec;
               std::vector<T>::iterator titer;
           };
           /* 前3个成员变量是不依赖于模板参数,所以是non-dependent name,后3个是dependent name
           ,直到实例化该模板的时候才会知道到底是什么类型。*/
           
       //下面来讨论typename的第二种用法。现在假设我们有一个类如下:
       template <typename T> class Y
       {
           T::iterator *iter;
           ...
       };
       /* 我们可能本意是想定义一个迭代器对象,例如我们如果用vector<int>来实例化这个模板,那么iter
       则应该是一个迭代器指针,但是,如果我们用下面这个类来实例化这个模板:*/
       class cType
       {
           static int iterator;
           ...
       };
       /* 那么T::iterator *iter会被编译器解释为两个数相乘。事实上,C++编译器会采用第二种解释方法
       ,即使iterator的确是一个类型名。
       为了避免这种矛盾,当我们适用qualified dependent name的时候,需要用typename来指出这是一个
       类型名.即: */
       template <typename T> class Y
       {
           typename T::iterator *iter;
           typedef typename T::iterator iterator; //定义了Y::iterator类型名称
           ...
       };
       //typename 指出下面紧跟着的名称是一个类型

     总结:T::iterator这种名称,由于iterator具体是类型还是成员变量取决于T的类型实现,所以当我们

               知道T::iterator是个类型名称时,如果我们要使用这个类型名,前面必须要加typename.

  • 相关阅读:
    CQUOJ 10819 MUH and House of Cards
    CQUOJ 9920 Ladder
    CQUOJ 9906 Little Girl and Maximum XOR
    CQUOJ 10672 Kolya and Tandem Repeat
    CQUOJ 9711 Primes on Interval
    指针试水
    Another test
    Test
    二分图匹配的重要概念以及匈牙利算法
    二分图最大匹配
  • 原文地址:https://www.cnblogs.com/wuchanming/p/3765345.html
Copyright © 2011-2022 走看看