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

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.

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

谢谢

Fre*_*Foo 8

这有效:

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)适用.