BЈо*_*вић 2 c++ gcc language-lawyer
这是一个例子:
struct A
{
A(const int a ):b(a)
{
}
int b;
};
struct B
{
B() : a(5)
{
}
static void A()
{
}
A a;
};
int main()
{
B::A();
}
Run Code Online (Sandbox Code Playgroud)
并且编译器错误是:
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’
Run Code Online (Sandbox Code Playgroud)
我在fedora 9上使用gcc 4.3.0.
有人能解释为什么编译器会抱怨吗?如果可能,请参考标准.
谢谢
这有效:
struct B {
B() : a(5) { }
static void A() { }
::A a;
};
Run Code Online (Sandbox Code Playgroud)
由于您已将其用作A成员名称B,因此该成员的定义会影响A外部名称空间中的类型.使用::你可以访问该命名空间.
此行为在(草稿)标准中指定为:
3.3.7(1) "一个名称可以通过嵌套声明区域中相同名称的显式声明来隐藏"(struct B嵌套在命名空间中struct A的定义也在其中定义).
请仔细阅读第3章基本概念的介绍,以获得进一步的说明.特别是,本节规定了这一点
3(7)两个名字相同如果
请注意,最后一个定义不区分类型和类成员,因此名称隐藏(阴影)规则3.3.7(1)适用.