Cor*_*ein 5 c++ compiler-errors forward-declaration
我收到此编译器错误
error: 'RawLog' does not name a type
Run Code Online (Sandbox Code Playgroud)
这是相关代码:
//DataAudit.h
#ifndef DATAAUDIT_H
#define DATAAUDIT_H
class RawLog;
class DataAudit
{
...
private:
RawLog* _createNewRawLog(); // This is the line indicated with the error
};
#endif // DATAAUDIT_H
Run Code Online (Sandbox Code Playgroud)
通常,前向声明可以解决此类错误.此答案表明包含循环标头可能会导致此问题.但是,使用#ifndef和#define语句是否阻止了循环标题包含?
还有其他原因我可能会看到这个错误吗?
我可以用什么方法来进一步推断出这个错误的本质?
更新:这很奇怪.我有一个Globals.h文件,如果我定义了一个新enum的Globals.h,出现错误.然后,如果我注释掉enum,那么错误就会消失.这让我认为循环依赖已经存在了一段时间,并且添加了enum某种方式重新排序编译单元,从而暴露了之前没有的依赖?
最后,我不确定我完全理解为什么会发生错误,但这就是我解决它的方法,以及其他一些相关信息。也许这会对遇到这个问题的其他人有所帮助。
#include "..."对于标题中的
每个#include,请将其删除。#include,则将其替换为class ...前向声明。#include并且使用指针并在堆上分配该成员是有意义的,则将该成员更改为指针,并#include用class ....前向声明替换。Globals.h并将所有可以从中移出的内容移至更本地化和特定的头文件中。
enum定义的 is Globals.h,并将其放置在更本地化的头文件中。完成所有这些后,我能够使错误消失。奇怪的是,enuminGlobals.h似乎是错误的催化剂。每当我将其从 中删除时Globals.h,错误就会消失。我不明白这如何enum导致错误,所以我认为它以某种方式间接导致了错误。我仍然无法确切地弄清楚如何或为什么,但它对我在 C++ 中编码时的指导方针有帮助:
除非需要,否则不要将任何内容放入头文件中。不要将任何
Globals.h可以放置在更本地化的文件中的内容放置在 a 中。基本上,尽一切努力减少指令中包含的代码量#include。
| 归档时间: |
|
| 查看次数: |
4551 次 |
| 最近记录: |