проблемы видимости с пространствами имен - PullRequest
1 голос
/ 06 июля 2010

У меня есть два исходных файла, один с именем main.cpp (где определено пространство имен M) и файл engines.h (где определены несколько имен).
main.cpp включает engines.h.
engines.h нужно использовать вещи внутри M, а M нужно использовать вещи внутри engines.h.

Я получаю ошибку при выполнении using namespace M; в engines.h.

Ответы [ 2 ]

3 голосов
/ 06 июля 2010

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

В какой ситуации вы получаете ошибку? Каково содержание заголовков?

2 голосов
/ 06 июля 2010

Вы не можете сделать using namespace M до того, как пространство имен было определено. Если есть циклическая зависимость, вам нужно решить ее, используя один или несколько методов

  • Форвард объявляет, если вашим пользователям не нужно знать членов или размер классов, а просто обращаться с указателями или ссылками на них:

    namespace M { class MyCow; }
    
  • Определение содержимого в Engine.cc

    // engines.h
    void f();
    
    // engines.cpp
    #include "main.h"
    void f() { MyCow muuh; }
    
  • Использование идиомы pimpl еще больше уменьшает зависимости, поскольку освобождает заголовки от заголовков, которые используются только реализациями.

Разделить часть в файлах .h для интерфейса и файлах .cpp для реализации для обработки таких зависимостей. Таким образом, заголовки меньше зависят от других заголовков, а файлы реализации могут включать заголовки.

...