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

Declaring my object as extern gives "not declared in this scope" error

本文关键字:声明 错误 范围内 对象 我的 extern      更新时间:2023-10-16

我在标题中有一个类:

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

当我编译时,我可以在代码的后面创建一个Communicator,并正常使用映射,没有任何问题。

然而,正如我在类声明后所说:

extern Communicator comm;

并添加:

Communicator comm;

对于标头的实现文件,我得到"error:'obj'未在此作用域中声明"等,其中obj是包含obj_version和tkt_metadata的命名空间(位于包含我的通信器标头之前)。

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

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

因此,我的一个头文件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.sh)。编译单元试图在没有定义命名空间obj中的对象的情况下编译Communicator。

所以答案是放入communicator.cc:

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

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

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

class Communicator {
public:
    std::map<std::string,obj::obj_version<obj::tkt_metadata>*> local_objects;
}; // <<<<< Note the ';' here!