关闭

typename在C++中的用法

标签: typename在c++中的用法
319人阅读 评论(0) 收藏 举报
分类:
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.

0
0
查看评论

C++ typename的起源与用法

目录 起因typename的常见用法typename的来源一些关键概念 限定名和非限定名依赖名和非依赖名类作用域 引入typename的真实原因 一个例子问题浮现千呼万唤始出来不同编译器对错误情况的处理使用typename的规则其它例子再看常见用法 参考写在结尾 起因 ...
  • somestill
  • somestill
  • 2016-03-03 15:41
  • 3414

C++中typename关键字的使用方法和注意事项

1, 什么地方使用?用在模板定义里,标明其后的模板参数是类型参数。例如 templateT foo(const T& t, const Y& y){//....};templaceclass CTest{private: T t;public: //.....
  • pizzq
  • pizzq
  • 2007-01-18 19:42
  • 20730

C++ - 模板(template)中typename的使用方法

模板(template)中typename的使用方法 http://blog.csdn.net/caroline_wendy/article/details/23910709 声明template参数时, 前缀关键字class和typename可以互换; 使用关键字typename标识嵌套...
  • u012515223
  • u012515223
  • 2014-04-17 10:31
  • 10501

C++ 关键字 typeid, typename

类型标识符(typeid)标准C++的一个新特征是RTTI(Run-Time Type Information运行时类型信息),它为程序在运行时确定对象类型,提供了一种标准方法。在标准C++中,有三个支持RTTI的元素:1.      &#...
  • touzani
  • touzani
  • 2007-06-04 17:14
  • 8009

typedef与typename的用法

1、类型说明typedef类型说明的格式为:typedef 类型 定义名;类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型。定义名表示这个类型的新名字。例如: 用下面语句定义整型数的新名字:typedef int SIGNED_INT;使用说明后, SIGNED_INT就成为int的...
  • Gao__Xiong
  • Gao__Xiong
  • 2016-10-09 10:29
  • 882

C++中的typename关键字

在C++中typename除了用于在定义模板函数和模板类中来替代关键字class,例如template换成template意外,typename还可以用来做型别的定义。 注意:下面的代码是有问题的 template void print2nd(const C& container) { ...
  • u010585135
  • u010585135
  • 2015-01-21 10:56
  • 772

c++中模板使用时候typename和class的区别

在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用于定义类,在模板引入c++后,最初定义模板的方法为: template...... 在 这里clas...
  • u011619422
  • u011619422
  • 2015-03-12 10:32
  • 2896

C++中typename和class在声明模板时的区别

问题在下面的 template declarations(模板声明)中 class 和 typename 有什么不同?template<class T> class Widget; // uses "class" template<typename T> ...
  • gatieme
  • gatieme
  • 2016-03-21 14:21
  • 2046

C++模板中typename和class的区别

template与template一般情况下这两个通用,但有一个特例,就是当 T 是一个类,而这个类又有子类(假设名为 innerClass) 时,应该用 template: typename T::innerClass myInnerObject; 这里的 typename 告诉编译器,T:...
  • qq_16209077
  • qq_16209077
  • 2016-07-30 16:32
  • 14363

C++中typename的用法

前言 最近在看STL源码剖析时,遇到了yig
  • chenhanzhun
  • chenhanzhun
  • 2014-09-11 17:10
  • 1222
    个人资料
    • 访问:3214次
    • 积分:124
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类