命名空间中的'Foo' 'bar' 不命名头文件中对象成员的类型
'Foo' in namespace 'bar' does not name a type for object member in header file
作为序言,我使用eclipse c++作为IDE。我使用c++0x11标准。(所以我可以使用互斥锁)我对c++很陌生,但以前做过一些C,对Java编程非常熟悉。而且,我知道。h通常不是c++文件的类型。
我试图在我的类stellad::Dispatcher中包含stellad::KeyHook的私有对象成员,并且在构建时得到以下错误:
Building file: ../src/KeyHook.cpp
Invoking: GCC C++ Compiler
g++ -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/KeyHook.d" -MT"src/KeyHook.d" -o "src/KeyHook.o" "../src/KeyHook.cpp"
In file included from ../src/KeyHook.h:10:0,
from ../src/KeyHook.cpp:8:
../src/Dispatcher.h:23:11: error: ‘KeyHook’ in namespace ‘stellad’ does not name a type
stellad::KeyHook keyhook;
^
src/subdir.mk:21: recipe for target 'src/KeyHook.o' failed
make: *** [src/KeyHook.o] Error 1
为了减少不必要的包括、原型和函数声明等干扰,已经删除了很多行。
Dispatcher.h
/*
* Dispatcher.h
*/
#ifndef DISPATCHER_H_
#define DISPATCHER_H_
#include "KeyHook.h"
namespace stellad {
class Dispatcher {
private:
..
stellad::KeyHook keyhook;
public:
Dispatcher();
virtual ~Dispatcher();
..
};
} /* namespace stellad */
int main(int argc, const char* argv[]);
#endif /* DISPATCHER_H_ */
KeyHook.h
/*
* KeyHook.h
*/
#ifndef KEYHOOK_H_
#define KEYHOOK_H_
#include "Dispatcher.h"
namespace stellad {
class KeyHook{
private:
..
public:
KeyHook();
virtual ~KeyHook();
..
};
} /* namespace stellad */
#endif /* KEYHOOK_H_ */
这是由每个文件包括另一个文件引起的。
如果第一个包含的是KeyHook.h
,那么在任何声明之前它包含Dispatcher.h
。这再次包括KeyHook.h
,但它发现KEYHOOK_H_
已经定义并且没有声明任何东西。然后标题看起来像这样:
// #include "KeyHook.h" from KeyHook.cpp
// #define KEYHOOK_H_
// #include "Dispatcher.h" from KeyHook.h
// #define DISPATCHER_H_
// #include "KeyHook.h" from Dispatcher.h
// KEYHOOK_H_ already declared
// end of #include "KeyHook.h" from Dispatcher.h
namespace stellad {
class Dispatcher {
private:
..
stellad::KeyHook keyhook; // KeyHook not declared here
public:
Dispatcher();
virtual ~Dispatcher();
..
};
} /* namespace stellad */
int main(int argc, const char* argv[]);
// end of #include "Dispatcher.h" from KeyHook.h
namespace stellad {
class KeyHook{
private:
..
public:
KeyHook();
virtual ~KeyHook();
..
};
} /* namespace stellad */
要解决这个问题,需要打破循环包含。KeyHook
不需要Dispatcher
,只需删除#include "Dispatcher.h"
。
您有一个循环包含问题。从KeyHook.h中移除#include "Dispatcher.h"
。您可能需要添加一个前向声明class Dispatcher;
。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在h文件中包含.o对象文件
- 如何使用单独文件中的派生类访问友元函数对象
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 使用逗号解析文件对象?
- 使用 CIN COUT 显示垃圾值的文件对象?
- 如何确保我的"ifstream"文件对象指向的文件内容已更新?
- 如何从 GDI+ 图元文件对象获取原始图元文件字节
- pyQt5 将文件对象传递给 QWebEngineView
- 从文件对象的当前位置删除字符
- 使用相同的文件对象按顺序写入和读取文件
- 将 ETW 文件对象与 DiskIO 事件相关联
- 如何在构建时将 JSON 文件/对象包含在C++中
- 如何使用运算符<<通过 << 将文件对象馈送到我的类?
- 确定两个文件路径引用同一文件对象的最佳方法是什么
- 文件映射对象和文件对象可以互换使用吗
- 如何判断给定点是否在STereoLithography(.stl)文件对象c++内
- 如何使用Windows Portable Devices C++API获取MTP设备公开的文件夹中的所有文件(对象)的列
- 如何使用结构传递文件对象
- 文件对象->文件名不返回文件的完整路径