我有以下代码,基本上是,
class foo {
public:
void method();
};
void foo::foo::method() { }
我不小心在 foo::method 的定义前面添加了一个额外的 foo:: 。此代码使用 g++(版本 4.2.3)编译时没有警告,但使用 Visual Studio 2005 时出错。我没有名为 foo 的命名空间。
哪个编译器是正确的?
如果我正确地阅读了标准,g++是正确的,而VS是错误的。
ISO-IEC 14882-2003(E),§9.2 等级(第 153 页): 类名在看到类名后立即插入到声明它的范围中。类名也被插入到类本身的范围中;这称为注入类名。出于访问检查的目的,注入的类名称被视为公共成员名称。
根据下面的评论,保留以下有关实际名称查找规则的内容也特别有用:
ISO-IEC 14882-2003(E),§3.4-3 名称查找(第 29 页): 出于名称隐藏和查找的目的,类的注入类名(第 9 条)也被视为该类的成员。
考虑到文本的最后部分为 9.2,如果不是的话那就很奇怪了。但正如 litb 评论的那样,这让我们放心,g++ 确实正在对标准做出正确的解释。没有问题了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)