C++箴言:理解typename的两个含义_第1页
C++箴言:理解typename的两个含义_第2页
C++箴言:理解typename的两个含义_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

templateclassWidget;//uses“class“

templateclassWidget;//uses“typename“

答案:没什么不同。在声明一个templatetypeparameter(模板类型参数)的时候,class和typename意味着完全一样的东西。一些程序员更喜爱在全部的时间都用class,由于它更简单输入。其他人(包括我本人)更喜爱typename,由于它示意着这个参数不必要是一个classtype(类类型)。少数开发者在任何类型都被允许的时候使用typename,而把class保存给仅承受user-definedtypes(用户定义类型)的场合。但是从C++的观点看,class和typename在声明一个templateparameter(模板参数)时意味着完全一样的东西。

然而,C++并不总是把class和typename视为等同的东西。有时你必需使用typename。为了理解这一点,我们不得不争论你会在一个template(模板)中涉及到的两种名字。

假设我们有一个函数的模板,它能取得一个STL-compatiblecontainer(STL兼容容器)中持有的能赋值给ints的对象。进一步假设这个函数只是简洁地打印它的其次个元素的值。它是一个用糊涂的方法实现的糊涂的函数,而且就像我下面写的,它甚至不能编译,但是请将这些事先放在一边——有一种方法能发觉我的愚蠢:

template//print2ndelementin

voidprint2nd(constC

{

//thisisnotvalidC++!

if(container.size()>=2){

C::const_iteratoriter(container.begin());//getiteratorto1stelement

++iter;//moveiterto2ndelement

intvalue=*iter;//copythatelementtoanint

std::cout

voidprint2nd(constC

...

}

这看上去似乎是我们将x声明为一个指向C::const_iterator的localvariable(局部变量)。但是它看上去如此仅仅是由于我们知道C::const_iterator是一个type(类型)。但是假如C::const_iterator不是一个type(类型)呢?假如C有一个staticdatamember(静态数据成员)碰巧就叫做const_iterator呢?再假如x碰巧是一个globalvariable(全局变量)的名字呢?在这种状况下,上面的代码就不是声明一个localvariable(局部变量),而是成为C::const_iterator乘以x!固然,这听起来有些愚蠢,但它是可能的,而编写C++解析器的人必需考虑全部可能的输入,甚至是愚蠢的。

直到C成为已知之前,没有任何方法知道C::const_iterator究竟是不是一个type(类型),而当template(模板)print2nd被解析的时候,C还不是已知的。C++有一条规章解决这个歧义:假如解析器在一个template(模板)中遇到一个nesteddependentname(嵌套依靠名字),它假定那个名字不是一个type(类型),除非你用其它方式告知它。缺省状况下,nesteddependentname(嵌套依靠名字)不是types(类型)。(对于这条规章有一个例外,我待会儿告知你。)

记住这个,再看看print2nd的开头:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论