请考虑以下示例.它由两个头文件组成,声明两个不同的名称空间:
// a1.h #pragma once #include "a2.h" namespace a1 { const int x = 10; typedef a2::C B; }
第二个是
// a2.h #pragma once #include "a1.h" namespace a2 { class C { public: int say() { return a1::x; } }; }
还有一个源文件main.cpp
:
#include#include "a1.h" #include "a2.h" int main() { a2::C c; std::cout << c.say() << std::endl; }
这样它就不会编译(尝试过GCC和MSVC).错误是a1
未声明名称空间(Windows上为C2653).如果您以main.cpp
这种方式更改包含订单:
#include "a2.h" #include "a1.h"
您会收到对称错误消息,即a2
未声明命名空间.
有什么问题?
您需要在头文件中使用前向声明,因为您有一个循环引用.像这样的东西:
// a1.h #pragma once namespace a2 { class C; } namespace a1 { const int x = 10; typedef a2::C B; }