«использование пространства имен» для определения глобальных функций - PullRequest
3 голосов
/ 13 июня 2019

При определении функций-членов класса в исходном файле мы можем использовать using namespace ns1::ns2::...::nsx, чтобы избежать необходимости полностью определять имена функций.

Например,

// Header file - foo.hpp
namespace ns1::ns2 {
    class FooClass {
        void fooMethod();
    }
}

// Source file - foo.cpp
#include "foo.hpp"
using namespace ns1::ns2;
void FooClass::fooMethod() {
    // do something
}

Однако недавно я попал впутаница при попытке определить глобальную функцию.

См. Следующий пример.

// Header file - bar.hpp
namespace ns1::ns2{
    void barFunction();  // <-- compile error: undefined reference
}

// Source file - bar.cpp
#include "bar.hpp"
using namespace ns1::ns2;
void barFunction(){
    // do something
}

Я ожидал, что компилятор выведет определение в bar.cpp как определение ns1::ns2::barFunction, определенное в bar.hpp.Но это не так.(Все работает нормально, если я использую полностью определенное имя в определении).

Это ожидаемое поведение или я что-то не так делаю?

1 Ответ

3 голосов
/ 13 июня 2019

Ожидаемое поведение.

[namespace.udir]

3 Директива using не добавляет членов в декларативный регион, в котором он появляется.

Это означает, что в глобальном пространстве имен в той точке, в которой вы его определяете, нет объявления для barFunction. И это делает определение первым и единственным объявлением такой функции (в глобальном пространстве имен).

Это сделано специально, потому что директива using часто может вводить больше имен, чем ожидалось. Таким образом, отсутствие возможности растоптать декларативный регион, в котором он выглядит, - это хорошо.

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