- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++箴言:理解typename 的两个含义
template class Widget; // uses “class “
template class Widget; // uses “typename “
答案:没什么不同。在声明一个 template type parameter (模板类
型参数)的时候,class 和 typename 意味着完全一样的东西 一些程序
员更喜爱在全部的时间都用 class,由于它更简单输入 其他人 (包括我
本人)更喜爱 typename ,由于它示意着这个参数不必要是一个 class
type (类类型)。少数开发者在任何类型都被允许的时候使用 typename,
而把 class 保存给仅承受 user-defined types (用户定义类型)的场合
但是从 C++ 的观 点看 ,class 和 typename 在声 明一 个 template
parameter (模板参数)时意味着完全一样的东西
然而,C++ 并不总是把 class 和 typename 视为等同的东西。有时
你必需使用 typename 。为了理解这一点,我们不得不争论你会在一个
template (模板)中涉及到的两种名字
假设 我们有 一个 函数 的模板 ,它能取得一个 STL-compatible
container (STL 兼容容器)中持有的能赋值给 ints 的对象。进一步假
设这个函数只是简洁地打印它的其次个元素的值 它是一个用糊涂的方法
实现的糊涂的函数,而且就像我下面写的,它甚至不能编译,但是请将这
些事先放在一边——有一种方法能发觉我的愚蠢:
template // print 2nd element in
void print2nd(const C
{
// this is not valid C++!
if (container.size() = 2) {
C::const_iterator iter(container.begin()); // get iterator to
1st element
++iter; // move iter to 2nd element
int value = *iter; // copy that element to an int
std::cout
void print2nd(const C
...
}
这看上去似乎是我们将 x 声明为一个指向 C::const_iterator 的
local variable (局部变量)。但是它看上去如此仅仅是由于我们知道
C::const_iterator 是一个 type (类型)。但是假如 C::const_iterator
不是一个 type (类型)呢?假如 C 有一个 static data member (静态
数据成员)碰巧就叫做 const_iterator 呢?再假如 x 碰巧是一个
global variable (全局变量)的名字呢?在这种状况下,上面的代码就
不 是 声 明 个 local variable (局 部 变 量 ), 而 是 成 为
C::const_iterator 乘以 x !固然,这听起来有些愚蠢,但它是可能的,
而编写 C++ 解析器的人必需考虑全部可能的输入,甚至是愚蠢的。
直到 C 成为已知之前,没有任何方法知道 C::const_iterator 究竟
是不是一个 type (类型),而当 template (模板)print2nd 被解析的时
候,C 还不是已知的。C++ 有一条规章解决这个歧义:假如解析器在一个
template (模板)中遇到一个 nested dependent name (嵌套依靠名字),
它假定那个名字不是一个 type (类型),除非你用其它方式告知它。缺省
状况下,nested dependent name (嵌套依靠名字)不是 types (类型)。
(对于这条规章有一个例外,我待会儿告知你。)
记住这个,再看看 print2nd 的开头:
template
void print2nd(const C // this name is assumed to
... // not be a type
您可能关注的文档
最近下载
- GZ089 环境检测与监测赛项 赛题 第六套-2024年全国职业院校技能大赛双数年拟设赛项赛题.pdf VIP
- 北京师范大学附属中学2022-2023学年高二上学期期末考试英语卷(解析版).docx VIP
- 2025沪教版新教材七年级上册英语单词衡水体字帖 .pdf
- 幼儿园小班观察记录案例.docx VIP
- ABB IRC5 Compact紧凑型机器人控制器产品说明书 中文.pdf VIP
- 2025年税务遴选试题及答案.docx VIP
- 2025年临床疾病概要消化性溃疡穿孔试题及答案.doc VIP
- GZ089 环境检测与监测赛项 赛题 第五套-2024年全国职业院校技能大赛双数年拟设赛项赛题.pdf VIP
- 咖啡知识与文化.pptx VIP
- 健康蓝海:揭示高增长保健食品赛道(2024).pdf VIP
原创力文档


文档评论(0)