2010-11-09 65 views
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。

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

感谢

回答

8

这工作:

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

    static void A() { } 

    ::A a; 
}; 

既然你已经在使用B作为A会员名称,会员的定义阴影从外部命名空间中的A类型。使用::您可以进入该名称空间。

此行为是在指定的(draft) standard为:

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

请仔细阅读第3章基本概念的介绍,以作进一步说明。特别是,该部分指定

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

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

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

+0

是的,我想出了静态方法名称会影响类名的难题,但它是代码还是编译器错误?另外,你能否说出标准中的含义? – 2010-11-09 15:05:20

+0

我添加了一些标准,我认为可以解释这种行为。对我来说,看起来很自然,你的代码不起作用。 – 2010-11-10 13:39:51

相关问题