C++ 类从属名称的歧义

2018-12-01  本文已影响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 是静态变量。很多人觉得这十分丑陋,但是总比没有好。

上一篇下一篇

猜你喜欢

热点阅读