C++箴言:理解typename的两个含义.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

182****9516 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档