Наличие статического метода класса с тем же именем, что и у другого класса - PullRequest
2 голосов
/ 09 ноября 2010

Вот пример:

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’

Я использую gcc 4.3.0 на fedora 9.

Можеткто-то объясняет, почему компилятор жалуется?По возможности со ссылками из стандарта.

Спасибо

1 Ответ

8 голосов
/ 09 ноября 2010

Это работает:

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) сокрытия имен.

...