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.

  • 相关阅读:
    OpenCV进阶之路:神经网络识别车牌字符
    System.ComponentModel.DataAnnotations.Schema.TableAttribute 同时存在于EntityFramework.dll和System.ComponentModel.DataAnnotations.dll中
    windows server 禁用智能卡服务的步骤
    yum 安装时错误 Errno 14 Couldn't resolve host 解决办法
    解决 CentOS7 安装完成后ifconfig命令不能用
    C#下RSA算法的实现(适用于支付宝和易宝支付)
    centos下问题:connect:network is unreachable
    maven 跳过单元测试
    Docker
    Jenkins和Docker
  • 原文地址:https://www.cnblogs.com/wuchanming/p/3765345.html
Copyright © 2011-2022 走看看