C ++ Встраивает ли пространство имен в неявное значение его функции? - PullRequest
2 голосов
/ 30 января 2020

Если у меня есть заголовок с:

namespace outer {
    inline namespace inner {
        void func();
    }
}

Тогда я не могу определить func() в отдельном. cpp файле, так как это дает мне ошибку компиляции:

- undefined reference to 'outer::inner::func()'

Так же, как если бы я объявил функцию встроенной. Это правильно? Означает ли это, что встраивание пространства имен неявно включает его функции. Я попытался посмотреть на https://en.cppreference.com/w/cpp/language/namespace, но нигде не смог найти, что это прямо указано.

РЕДАКТИРОВАТЬ 2: Не обращать внимания, предыдущее редактирование. Мне не удалось правильно настроить мой файл cmake и, следовательно, я не смог скомпилировать код. Смотрите ответ за ответ на оригинальный вопрос. Спасибо всем!

РЕДАКТИРОВАТЬ:

Вот пример, который я не могу скомпилировать:

Test.h

namespace Core {
    inline namespace TestNameSpace {
        void write();
    }
}

Test . cpp

#include <iostream>
#include "Test.h"

void Core::write() {
    std::cout << "BAJS\n";
}

main. cpp

#include "Test.h"
int main() {
    Core::write();
    return 0;
}

Следует отметить, что #include "Test.h" отображается серым в моей среде IDE в файле Test. cpp.

1 Ответ

4 голосов
/ 30 января 2020

Простой ответ: нет. Вы можете абсолютно определить функции в отдельном файле cpp. inline в пространстве имен делает так, что вам не нужно указывать имя пространства имен. Например, вы можете сделать outer::func() вместо outer::inner::func()

См. [namespace.def]/5-7. Нет никаких ограничений относительно того, где вы должны определять функции, и что оно неявно указывает на них.

Ошибка, которую вы получаете, заключается в том, как вы компилируете. Вероятно, вы забыли скомпилировать файл. cpp или, по крайней мере, связать его с тем местом, откуда он вызывается.

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