Указание пространств имен явно в определениях методов - PullRequest
0 голосов
/ 30 августа 2018

Предположим, у меня есть пространство имен Foo, и я объявил внутри него класс Bar с конструктором, унаследовавшим класс Base с его конструктором вместе с некоторым другим классом Baz с общедоступным методом boo() * * 1006

namespace Foo {
    class Baz {
    public:
        void boo();
    };
    class Base {
    public:
        Base();
    };
    class Bar: public Base {
    public:
        Bar();
    };
}

Теперь я хочу определить конструктор Bar в моей реализации следующим образом:

Foo::Bar::Bar(): Foo::Base::Base() {
    Foo::Baz::boo();
}

Похоже, что можно записать это так:

Foo::Bar::Bar(): Base() {
    Baz::boo();
}

Это означает, что если я явно указываю пространство имен в Foo::Bar::Bar(), нет необходимости указывать его позже при определении этого метода.

Работает ли так везде - от явного упоминания пространства имен до конца определения?

1 Ответ

0 голосов
/ 30 августа 2018

Если мы посмотрим на ваше Bar определение конструктора:

Foo::Bar::Bar(): Base() {
    Baz::boo();
}

Как только часть объявления конструктора (Foo:::Bar::Bar) была прочитана компилятором, он знает область действия и больше не нужен.

Более интересным примером будет, например,

namespace Foo
{
    struct Baz {};

    struct Bar
    {
        Baz fun(Baz);
    };
}

Foo::Baz Foo::Bar::fun(Baz)
{
    // Irrelevant...
}

Теперь, для определения самой структуры, Baz не нуждается ни в каком квалификаторе пространства имен, поскольку он определен в пространстве имен, и все символы пространства имен доступны непосредственно.

Определение функции fun другое. Поскольку он не определен внутри пространства имен, нам необходимо полностью определить структуру Baz для возвращаемого типа. И то же самое для фактического имени функции. Но затем, как и раньше, когда эта часть читается и анализируется компилятором, он знает область действия и знает, что аргумент Baz действительно Foo::Baz.

Вы можете узнать больше о поиске имен в этой ссылке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...