将我的对象声明为 extern 会给出"未在此范围内声明"错误
Declaring my object as extern gives "not declared in this scope" error
我在标题中有一个类:
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!
相关文章:
- 在气泡排序程序中未声明错误功能
- 未在此范围内声明错误 'xy'
- 在此范围内未声明错误"Clreol"
- 为什么 C 编译器不在 for 循环体中给出重新声明错误?
- 如何修复范围内的字符串声明错误
- 如何修复C++中的"arrStud未在此范围内声明"错误
- 无法识别的模板声明错误 - 不明白我做错了什么
- C 如何从构造函数中声明(错误C2065未宣布的标识符)
- C 无法解释的类“尚未声明”错误,这是由于名称空间而导致的
- 如何解决声明错误
- 在标题文件中获取声明错误
- 异常声明错误
- "inet_ntoa"未声明错误
- #include <string> 导致很多'<blank>'尚未声明错误
- 类声明错误
- C++成员函数未声明错误时(当它看起来是错误时)
- 代码块 HelloWorld C 示例不起作用:未声明错误"ptrdiff_t"
- 头文件类成员函数声明错误:"incomplete type name in nested name specifier"
- 预期语句和预期声明错误 c++
- 针对 android 编译的问题..."未在此范围内声明"错误