具有与另一个类同名的类静态方法

时间:2010-11-09 14:11:55

标签: 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();
}

编译错误是:

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。

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

由于

1 个答案:

答案 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)适用。