我在标题中有一个类:
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的名称空间(并且在包含我的通信器之前)头)。
这里发生了什么,我能做些什么来让它正确编译?谢谢!
答案 0 :(得分:1)
哦,我刚刚通过有用的评论发现了这个问题(它已被删除)。
因此我的一个头文件object.h
(不包含Communicator
但Communicator
处理的对象)实际上看起来有点像这样:
-- obj_version and tkt_metadata
-- #include "communicator.h"
-- more stuff
我的实施文件是这样的:
-- #include "communicator.h"
-- define the functions
-- Communicator comm;
然而,评论中有人提到C ++中的“编译单元”。结果标题不是自己编译的,只编译实现文件,并且只为每个实现文件放置标题。
因此,虽然我的Communicator
被包含在我需要查看的对象之后(在object.h中),但实现文件只包含communicator.h,而不是object.h(包括communicator.h in转)。编译单元尝试编译Communicator而不在其前面定义名称空间obj中的对象。
所以答案是放入communicator.cc:
-- #include "objects.h"
-- define the functions
-- Communicator comm;
这是一个相当简单的问题(可能不会只有我提供的信息对任何人负责)但是,谢谢,你让我解决了我自己的误解!
答案 1 :(得分:0)
您是否忘记了真实代码中的;
或者忘了把它放在这里?
class Communicator {
public:
std::map<std::string,obj::obj_version<obj::tkt_metadata>*> local_objects;
}; // <<<<< Note the ';' here!