代码之家  ›  专栏  ›  技术社区  ›  BЈовић

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

  •  2
  • BЈовић  · 技术社区  · 14 年前

    下面是一个例子:

    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’
    

    我在Fedora9上使用GCC4.3.0。

    如果可能,参考标准。

    谢谢

    1 回复  |  直到 13 年前
        1
  •  8
  •   Fred Foo    14 年前

    这是有效的:

    struct B {
        B() : a(5) { }
    
        static void A() { }
    
        ::A a;
    };
    

    A 作为成员名 B 一个 从外部命名空间键入。使用 :: 您可以到达那个名称空间。

    (draft) standard 作为:

    3.3.7(一) struct B ,它嵌套在命名空间中,其中 struct A

    请仔细阅读第3章“基本概念”的导言,以便进一步澄清。特别是,本节规定

    3(7) 两个名字是一样的如果

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

    请注意,最后的定义没有区分类型和类成员,因此应用名称隐藏(阴影)规则3.3.7(1)。