我有两个源文件,一个名为main.cpp
(其中定义了名称空间M
)和文件engines.h
(其中定义了多个名称)。
main.cpp
包括engines.h
engines.h
需要使用M
中的内容,M
需要使用engines.h
内的内容。
我在using namespace M;
中执行engines.h
时收到错误。
答案 0 :(得分:3)
不要在头文件中使用namespace。这将从包含该头文件的每个翻译单元内的命名空间中获取所有符号,因此您将有一个符号混乱(名称冲突,这可能是您在您的情况下所面临的)。在头文件中使用完全限定,或者至少在本地使用using namespace语句(在一个函数或方法中,在那里提高可读性)。
根据您的情况,您得到的错误是什么?标题的内容是什么?
答案 1 :(得分:2)
在定义命名空间之前,您无法执行using namespace M
。如果存在循环依赖关系,则需要使用一种或多种技术来解决它
如果您的使用不需要知道类的成员或大小,只需处理指针或对它们的引用,则转发声明:
namespace M { class MyCow; }
在engines.cc中定义东西
// engines.h
void f();
// engines.cpp
#include "main.h"
void f() { MyCow muuh; }
使用pimpl idiom可以进一步减少依赖关系,因为它可以使标头不受仅由实现使用的标头的影响..
将.h文件中的部分拆分为接口和.cpp文件,以便实现处理此类依赖项。这样,标头较少依赖于其他标头,并且实现文件可以包括标头。