将我的对象声明为extern会给出“未在此范围内声明”错误

时间:2013-07-28 17:07:25

标签: c++ extern

我在标题中有一个类:

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的名称空间(并且在包含我的通信器之前)头)。

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

2 个答案:

答案 0 :(得分:1)

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

因此我的一个头文件object.h(不包含CommunicatorCommunicator处理的对象)实际上看起来有点像这样:

-- 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!