"不命名类型"错误,但类指针已经有前向声明?

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文件,如果我定义了一个新enumGlobals.h,出现错误.然后,如果我注释掉enum,那么错误就会消失.这让我认为循环依赖已经存在了一段时间,并且添加了enum某种方式重新排序编译单元,从而暴露了之前没有的依赖?

Cor*_*ein 3

最后,我不确定我完全理解为什么会发生错误,但这就是我解决它的方法,以及其他一些相关信息。也许这会对遇到这个问题的其他人有所帮助。

  1. 对于我的项目中的每个头文件
    1. #include "..."对于标题中的 每个
      1. 如果 中没有对该类的引用#include,请将其删除。
      2. 如果只有指向 中定义的类的指针#include,则将其替换为class ...前向声明。
      3. 如果定义了类的成员实例,#include并且使用指针并在堆上分配该成员是有意义的,则将该成员更改为指针,并#includeclass ....前向声明替换。
  2. 浏览 myGlobals.h并将所有可以从中移出的内容移至更本地化和特定的头文件中。
    1. 具体来说,删除enum定义的 is Globals.h,并将其放置在更本地化的头文件中。

完成所有这些后,我能够使错误消失。奇怪的是,enuminGlobals.h似乎是错误的催化剂。每当我将其从 中删除时Globals.h,错误就会消失。我不明白这如何enum导致错误,所以我认为它以某种方式间接导致了错误。我仍然无法确切地弄清楚如何或为什么,但它对我在 C++ 中编码时的指导方针有帮助:

除非需要,否则不要将任何内容放入头文件中。不要将任何Globals.h可以放置在更本地化的文件中的内容放置在 a 中。基本上,尽一切努力减少指令中包含的代码量#include