美文网首页
C++ 类从属名称的歧义

C++ 类从属名称的歧义

作者: 家中古词 | 来源:发表于2018-12-01 21:33 被阅读9次

C++ 里,要访问名字空间中从属的名字,使用的是 NameSpace::NestName。于是(不知道为什么有此于是)访问类的从属类型名时,也用这个语法。

Container::const_iterator *cit;

以上的代码好像表示声明一个 Container::const_iterator 类型的指针变量 citconst_iteratorContainer 里声明的类型。但是其实还有另一种可能,const_iteratorContainer 里的一个静态变量,而 cit 是另一个变量。那么这个语句的意思是这两个变量相乘

C++ 习惯使用相同的符号(关键字)在不同的环境下表示不同的意思,以上情况的出现就是因为类之中取得从属类型和取得静态变量使用一样的用法,而指针修饰乘号也都使用星号。这无疑是在表明“出来混,迟早要还的”。

如果 C++ 不允许从属类型名和静态变量名字重名呢?这样的话好像就可以通过解析类型的定义来确定从属名字是从属类型名还是静态变量名。但是,在使用模板编程时,这会导致很大的混乱。当类名字是一个模板参数,可能导致某些展开产生一个声明,另一些展开产生一个乘法。这种程度的变化,已经不能称作是多态,而是一种可怕的混沌。

所以,C++ 采取的办法是,当类从属名称指向一个从属类型名时,在前面加上 typename 关键字;而不加这个关键字,则认为是静态变量。

例如,typename Container::iterator 是一个类型名,Time::Second 是静态变量。很多人觉得这十分丑陋,但是总比没有好。

相关文章

  • C++ 类从属名称的歧义

    C++ 里,要访问名字空间中从属的名字,使用的是 NameSpace::NestName。于是(不知道为什么有此于...

  • Codedesign写作规范

    写作规范 类: ‘#’ 开头的都是类,‘#’的数量决定了类的从属关系 ‘#’后的文本:‘:’前的是类的名称,‘:’...

  • 英语语法极速通关21|从属连词

    目录 连接词的第二大类是从属连词。从名称上就能看出,并列连词强调对等关系,而从属连词则强调的是主次关系。 一、从属...

  • 《JAVA编程思想》学习笔记:第7章(复用类)

    第7章 复用类 7.1 名称屏蔽 在C++中,如果基类拥有一个已被多次重载的方法名称,那么在其派生类中重新定义该方...

  • 05 棘手的问题

    typename前缀 C++默认用::访问的名称不是类,因此必须加上typename前缀,告诉编译器该名字是一个类...

  • Java复习回顾

    JDK包含JRE(lib+JVM)包含JVM 静态变量:在类加载后就可以使用了,从属于类,成员变量从属于对...

  • 习题 42 对象、类及从属关系

    习题 42 对象、类及从属关系 结果: 调用父类的初始化方法

  • C++名称空间(namespace)

    前言 当随着C++项目项目的增大,名称相互冲突的可能性也将增加。使用多个厂商的类库时,可能导致名称冲突。例如,两个...

  • 为什么说Objective-C不支持命名空间

    命名空间是C++以及C#等语言所带有的特性, 他可以让你创建两个相同名称的类, 并且不会产生冲突比如, 在C++中...

  • EOS学习笔记-3.C++的反射是什么?

    C++是不支持通过类名称字符串”ClassXX”来生成对象的,我们可以使用ClassXX* object =new...

网友评论

      本文标题:C++ 类从属名称的歧义

      本文链接:https://www.haomeiwen.com/subject/xbzrcqtx.html