2

这是示例:

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。

有人可以解释为什么编译器会抱怨吗?如果可能,请参考标准中的参考资料。

谢谢

4

1 回答 1

8

这有效:

struct B {
    B() : a(5) { }

    static void A() { }

    ::A a;
};

由于您已在 中用作A成员名称B,因此该成员的定义会隐藏A外部命名空间中的类型。使用::您可以访问该名称空间。

此行为在(草案)标准中指定为:

3.3.7 (1) “一个名称可以通过在嵌套声明区域中的同名显式声明来隐藏”(的定义struct B,它嵌套在struct A同样定义的命名空间中)。

仔细阅读第 3 章“基本概念”的介绍,以获得进一步的说明。特别是,本节规定

3 (7)如果两个名字相同

  • 它们是由相同的字符序列组成的标识符;或者
  • 它们是由相同运算符组成的重载运算符函数的名称;或者
  • 它们是由相同类型组成的用户定义转换函数的名称。

请注意,最后一个定义不区分类型和类成员,因此名称隐藏(隐藏)规则 3.3.7 (1) 适用。

于 2010-11-09T14:16:51.880 回答