以下是示例:
struct A
{
A(const int a ):b(a)
{
}
int b;
};
struct B
{
B() : a(5)
{
}
static void A()
{
}
A a;
};
int main()
{
B::A();
}
编译错误是:
a9.cpp:19: error: ‘A’ does not name a type
a9.cpp: In constructor ‘B::B()’:
a9.cpp:24: error: class ‘B’ does not have any field named ‘a’
我在fedora 9上使用gcc 4.3.0。
有人能解释为什么编译器会抱怨吗? 如果可能,请参考标准。
由于
答案 0 :(得分:8)
这有效:
struct B {
B() : a(5) { }
static void A() { }
::A a;
};
由于您在A
中使用B
作为成员名称,因此该成员的定义会影响外部命名空间中的A
类型。使用::
,您可以访问该命名空间。
此行为在(draft) standard中指定为:
3.3.7(1)“名称可以通过嵌套声明区域中相同名称的显式声明来隐藏”(struct B
的定义,嵌套在名称空间,struct A
也被定义。)
仔细阅读第3章基本概念的介绍,以获得进一步的说明。特别是,本节指定
3(7)如果
,两个名称相同请注意,最后一个定义不区分类型和类成员,因此名称隐藏(阴影)规则3.3.7(1)适用。