1

我在标题中有一个类:

class Communicator {
public:
std::map<std::string,obj::obj_version<obj::tkt_metadata>*> local_objects;
}

当我编译时,我可以稍后在代码中创建一个 Communicator 并正常使用地图,没有问题。

但是,一旦我在类声明之后放置:

extern Communicator comm;

并添加:

Communicator comm;

对于标头的实现文件,我得到“错误:'obj' 未在此范围内声明”等,其中obj包含 obj_version 和 tkt_metadata 的命名空间(并且在包含我的通信器标头之前)。

这里发生了什么,我能做些什么来让它正确编译吗?谢谢!

4

2 回答 2

1

哦,我刚刚通过有用的评论发现了这个问题(它已被删除)。

所以我的一个头文件object.h(不包含Communicator但可以工作的对象Communicator)实际上看起来有点像这样:

-- obj_version and tkt_metadata
-- #include "communicator.h"
-- more stuff

我的实现文件是这样的:

-- #include "communicator.h"
-- define the functions
-- Communicator comm;

但是,有人在评论中提到了 C++ 中的“编译单元”。结果头文件不是自己编译的,只编译实现文件,并且头文件只是为每个实现文件放置到位。

因此,虽然 myCommunicator包含在我需要查看的对象之后(在 object.h 中),但实现文件仅包括 communicator.h,而不包括 object.h(依次包括 communicator.h)。编译单元试图编译 Communicator,但没有在其之前定义命名空间 obj 中的对象。

所以答案是放入communicator.cc:

-- #include "objects.h"
-- define the functions
-- Communicator comm;

这是一个相当简单的问题(可能只有我提供的信息任何人都无法回答)但是谢谢,你让我解决了我自己的误解!

于 2013-07-28T17:29:30.510 回答
0

您是;在真实代码中忘记了 a 还是只是忘记把它放在这里?

class Communicator {
public:
    std::map<std::string,obj::obj_version<obj::tkt_metadata>*> local_objects;
}; // <<<<< Note the ';' here!
于 2013-07-28T17:16:50.170 回答