这段时间一直在查找类型名称之类的问题,今天正好有机会和大家共享一下.

先来看上面一个问题:
在template声明中,使用class和typename有什么不同?
template<class T>class Widget;
template<typename T>class Widget;
抛开使用习气,声明template参数时,单从C++本身的角度来看,使用关键字class或typename没有任何不同。

但是C++并非把它们完整视为等价,因为存在既有价值,如果完整一样,干嘛费力的搞了两个出来呢,一个岂不是更便利。
在这里你要知道,有时候你必须使用typename。
我们先看上面这个函数模板例子:

template<typename T>
void print(const T& container)
{if(container.size()>=1){T::const_iterator iter(container.begin());int value=*iter;std::cout<<value;}
}

这个模板函数的功能是接收一个STL容器为参数。然后将容器中的第一个元素打印出来。

看起来没什么问题,编译也能通过,如果你亲自测试的话,也会发现可以运行精良。但是在某些极端情况下,呵呵,会发生什么呢?

我们先来看一个观点:

T::const_iterator

iter的类型是T::const_iterator,但是实际上iter是什么是取决于T。

而const_iterator这个名称的详细含义也是依赖于T的,我们将它称为从属名称。T::const_iterator这个整体是一个嵌套,我们称它为嵌套从属类型名称。因为const_iterator是从属于T的。

嵌套从属名称可能致使解析困难。我们看上面的代码

每日一道理
自己把自己说服了,是一种理智的胜利;自己被自己感动了,是一种心灵的升华;自己把自己征服了,是一种人生的成功。
template<typename T>
void print(const T& container)
{T::const_iterator* m;...
}

这里我们声明m为一个局部变量,它是一个指向T::const_iterator的指针。

但是有一种情况,如果T::const_iterator它不是一个类型,而是T中的一个静态成员变量(确实有这个可能),而这时m碰巧也是一个全局变量(哪有这么巧的事呀!),那上面的代码就不是定义一个指针变量了,而是两个静态变量相乘。

上面的情况虽然特殊,但确实有可能发生的。所以C++解析器的设计者必须考虑如何防止这个问题。

C++有个规矩可以解析这一歧义状态:如果解析器在模板中遇到这个嵌套从属名称,它便假设这个名称不是一个类型。除非你明白告诉他。在缺省情况下,嵌套从属名称不是类型。

template<typename T>
void print(const T& container)
{if(container.size()>=1)T::const_iterator iter(container.begin());...
}

上面这段程序不是有效的C++代码。iter只有在T::const_iterator是一个类型时才合理,但是我们并没有明白告诉C++,所以它默许它不是一个类型。

要想告诉C++,明白指定它是一个类型很简单,在前面加上一个typename就行了

template<typename T>
void print(const T& container)
{if(container.size()>=1)typename T::const_iterator iter(container.begin());//明白指定是一个类型...
}

文章结束给大家分享下程序员的一些笑话语录: 有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。
“如果你亲我一下,我会变成一个美丽的公主哦。”男人一言不发,把青蛙捡起来,放入口袋。
“如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。”男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。”男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。”再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
  最后,青蛙无力地问:“我开出了这么好的条件,为什么你还不肯吻我?”男人说:“我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。”

--------------------------------- 原创文章 By
类型和名称
---------------------------------

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/05/24/3098121.html

类型名称了解typename的双重意义相关推荐

  1. C/C++编程:了解typename的双重意义

    问题:在下面模板声明式中,class和typename有什么不同? 回答:没有什么不同.当我们声明模板类型参数,class和typename的意义完全相同. 然而,C++并不总是把class和type ...

  2. 模板与泛型编程知识点:编译期多态、typename标识嵌套从属类型名称

    1.隐式接口与编译期多态: 显式接口:一般类成员函数定义的接口. 隐式接口:模板函数/类中定义的函数,由于参数类型.返回类型可能不定,因此为隐式接口. 运行时多态:virtual函数引出的多态行为. ...

  3. C++ typename 的双重含义

    1.模板类型参数申明 使用模板时,在申明模板类型参数时,我们经常有如下两种申明方式: // 方式一 template <class T> CTest;// 方式二 template < ...

  4. 了解typename的双重定义

    了解typename的双重定义 这里只说一个小坑 具体的typename使用方法和注意事项见Effective C++条款42 首先typename是template(泛型编程的定义)有众所周知的作用 ...

  5. 如何在C++中获得完整的类型名称

    Wrote by mutouyun. (http://darkc.at/cxx-get-the-name-of-the-given-type/) 地球人都知道C++里有一个typeid操作符可以用来获 ...

  6. error C2899: 不能在模板声明之外使用类型名称

    英文的真实描述为:"typename cannot be used outside a template declaration",由于翻译错误,将 typename 翻译成了 类 ...

  7. c 编程替换语言,巧用typedef替换类型名称

    为了方便我们编写程序,通常我们在利用C语言进行编写程序的过程中都会给某一数据类型替换一个新的名称,而往往我们通过使用关键字typedef来给数据类型进行名称的替换.那么到底什么是关键字typedef呢 ...

  8. Golang反射机制的实现分析——reflect.Type类型名称

    现在越来越多的java.php或者python程序员转向了Golang.其中一个比较重要的原因是,它和C/C++一样,可以编译成机器码运行,这保证了执行的效率.在上述解释型语言中,它们都支持了&quo ...

  9. boost::type_index模块实现一个类型中获得简短的和人类可读的类型名称

    boost::type_index模块实现一个类型中获得简短的和人类可读的类型名称 实现功能 C++实现代码 实现功能 boost::type_index模块实现一个类型中获得简短的和人类可读的类型名 ...

最新文章

  1. 实验23:测试泛型依赖注入★
  2. laya 怎么生成签名_什么是数字签名
  3. Timus 1018 树形DP
  4. Golang笔记——方法
  5. 鬼灭之刃人物炫酷高清壁纸
  6. python怎么实现deepcopy_deepcopy和python-避免使用的提示?
  7. apache-hive-3.1.0-bin.tar.gz 下载
  8. Linux下截图的简单方案
  9. 数据读取入门——xlsread
  10. elasticsearch搜索IK分词器实现单个字搜索
  11. 【戏言、昔言、惜言】谭惜言写了一辈子的戏,真情假意,全在戏言里。
  12. Python制作短信发送程序
  13. Unity3D 模型分块
  14. 智能对话平台UNIT 7.0三大引擎正式亮相
  15. JAVA实现QQ:实现文字聊天、QQ用户登录、拉取在线用户列表、无异常退出、私聊、发文件、下载文件、离线留言、服务端推送新闻等功能(后端无界面,Utilty源码在后面、)
  16. 2021-2025年中国采油软件行业市场供需与战略研究报告
  17. springboot遇到的Invalid bound statement (not found): com.yc.service.UserService的众多坑
  18. 活动目录之故障解决:域控制器不同步处理办法
  19. android 电视盒子项目外包
  20. 弹指间计算机协会 2021“千里码”程序设计竞赛 题面

热门文章

  1. python【蓝桥杯vip练习题库】ADV-186排列式
  2. python【蓝桥杯vip练习题库】ALGO-82 输出米字形
  3. Python程序设计题解【蓝桥杯官网题库】 DAY10-算法训练
  4. java版扫雷下载_Java 实现扫雷游戏(MineSweeper)
  5. 浅析搜索引擎对网站的抓取规则有哪些方面
  6. 每个网站SEO优化人员都要熟知的三大图片优化技巧
  7. 计算机学院陈宇,为了纯粹的追求———记计算机学院“物联网”工作室-湖北第二师范学院电子版《湖北第二师范学院报》...
  8. 闭包函数python_Python--函数对象闭包函数
  9. 装箱算法 java_贪心算法装箱问题-Java代码
  10. (整理类)文件描述符,文件描述符标志,文件状态标志