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.

c++ typename用法相关推荐

  1. C++(八)——typename用法

    1.typename来源 1.1原因1: 从表面上看,下面模板的参数只支持用户自定义类型,但其实对语言内置类型或者指针调用也支持: template <class T> int compa ...

  2. C++中typename用法

    typename用法: 1.在c++模板中,用于类型参数化的关键字 2.内嵌.依赖类型名 注:C++11中, typename用于指明紧跟其后的是个类型 1. 在C++中typename一般用来声明模 ...

  3. 模板编程中typename用法

    模板编程中typename用法 文章目录 模板编程中typename用法 typename的常规用法 typename的第二个用法:修饰类型 typename使用规则 typename的常规用法 ty ...

  4. C++ 中 typename用法

    1.typename的常规用法 typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数: 2.typename的第二个用法:模板中标明"内嵌 ...

  5. typename用法

    转自百度百科 class关键字的同义词 这是一项C++编程语言的泛型编程(或模板编程)的功能,typename关键字用于引入一个模板参数,例如: // 定义一个返回参数中较大者的通用函数 templa ...

  6. typedef 与 typename 的用法

    一.typedef:类型说明 类型说明的格式为: typedef 类型 新定义名: 类型说明只定义指定的一个类型的新名字,并不是定义一种新的数据类型. eg: typedef int INT; 这样声 ...

  7. 最好的 C++ 模板元编程干货!

    链接 | https://www.cnblogs.com/liangliangh/p/4219879.html 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能 ...

  8. C++ typename的起源与用法

    目录 起因 typename的常见用法 typename的来源 一些关键概念 限定名和非限定名 依赖名和非依赖名 类作用域 引入typename的真实原因 一个例子 问题浮现 千呼万唤始出来 不同编译 ...

  9. typename的起源与用法

    typename的起源与用法 侯捷在Effective C++的中文版译序中提到: C++的难学,还在于它提供了四种不同(但相辅相成)的程序设计思维模式:procedural-based, objec ...

最新文章

  1. 在MySQL和PostgreSQL之外,为什么阿里要研发HybridDB数据库?
  2. php或js判断网站访问者来自手机或者pc端源码
  3. Qt Creator创建一个移动应用程序
  4. autoLayout自动布局
  5. vue 单独页面定时器 离开页面销毁定时器
  6. mysql mongodb binlog_订阅MongoDB的数据变更比解析mysql的binlog更简单
  7. 接口implements(Java)
  8. 2021 互联网公司时薪排行榜出炉!多多排榜首!微软、美团很强!
  9. 浅析busybox如何集成到openwrt
  10. 妙盈科技:ESG数据提供商获融资
  11. 基于IDEA 最新Spirng3.2+hibernate4+struts2.3 全注解配置 登录
  12. 苹果Mac怎样切换大写输入法?
  13. 1147 Heaps (30 分)
  14. grunt html模块化管理插件,grunt模块化配置
  15. html css jsp 数据库,html、css、js、jsp的区别是什么?
  16. linux系统有什么用
  17. like to do 和like doing的区别
  18. 怎么用手机修改服务器的网关,网关,详细教您手机怎么改网关和IP
  19. 【微博技巧】绕开微博绑定手机注册微博
  20. 创始人退休后的Python,起飞还是没落?

热门文章

  1. 【安全知识分享】全员安全法律法规专项培训143页.pptx(附下载)
  2. java pdf生成图片水印 itext
  3. 微信突然迎来重大更新!这波新功能把我看傻了
  4. 二十世纪计算机技术逐渐发展起来,机电一体化在建筑智能化工程中的技术分析及应用...
  5. 数据科学库学习第一节
  6. 在线考试例子(vant+vue)
  7. SLAM十四讲:第三讲习题
  8. 用手机开直播需要买些什么样的直播设备?
  9. day04【JS高级】BOM对象、Window对象、二种定时器、 Location对象、DOM对象、DOM获取元素、DOM操作内容、DOM操作属性、DOM操作样式、DOM操作元素(标签)、 正则表达式
  10. 23种设计模式的简单介绍