【发布时间】:2013-08-31 14:19:28
【问题描述】:
我正在做一个项目,每个头文件都有一个预处理器包含保护。 我的包含是这样的:
(文件 -> 包含)
main.cpp -> header.h;字符.h
header.h -> 向量、iostream、...、DataFiles.h
Character.h -> DataFiles.h、header.h、CharFrame.h
CharFrame.h -> DataFiles.h, header.h
一切正常。但是,如果我只是删除 main.cpp 的 #include "Character.h" 以将其移动到 header.h 中,我会在编译时遇到很多错误。所以现在是:
main.cpp -> header.h
header.h -> ... , DataFiles.h, Character.h.
有什么区别?
这是我的编译器输出:
Inspiron-1545:~/Desktop/LF2_linux$ g++ -Wall main.cpp DataFiles.cpp header.cpp Character.cpp CharFrame.cpp -lSDL -lSDL_image -lSDL_ttf -o test
In file included from header.h:13:0,
from CharFrame.h:12,
from CharFrame.cpp:1:
Character.h:55:15: error: ‘CharFrame’ was not declared in this scope
Character.h:55:25: error: template argument 1 is invalid
Character.h:55:25: error: template argument 2 is invalid
如果将 include 放回 main.cpp 中,则编译不会出现任何错误。
如果你觉得我的代码是必要的,我会编辑这篇文章并粘贴所有内容。
以下是感兴趣的行:
header.h:13 ->
#include "Character.h"
CharFrame.h:12 ->
#include "header.h"
CharFrame.cpp:1 ->
#include "CharFrame.h"
Character.h:55 ->
std::vector <CharFrame*> *frame;
【问题讨论】:
-
听起来像
header.h使用CharFrame,但它在CharFrame声明之前包含(使用)在CharFrame.h中。所以编译器在声明之前偶然发现了CharFrame。 -
如果你按照你说的做,应该没有区别。但是由于某种原因,编译器无法识别类型
CharFrame。你可以发SSCE 来重现这个问题吗? -
DataFiles.h 是否包括任何其他文件?
-
我认为你不能有 2 个相互直接包含的标题(header.h、charframe.h)。如果您有circular dependency,则可以使用多种解决方案之一。
-
@AlexandreToqué this 建议将前向声明作为解决方案。在 header.h 中前向声明 charframe 类并在 header.cpp 中实现它