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

时间:2013-08-02 22:12:38

标签: c++ compiler-errors forward-declaration

我收到此编译错误

error: 'RawLog' does not name a type

以下是相关代码:

//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

通常,前向声明可以解决此类错误。 This回答表明包含循环标头可能会导致此问题。但是,使用#ifndef#define语句是否会阻止包含循环标题?

还有其他原因我可能会看到此错误吗?

我可以用什么方法来进一步推断出这个错误的性质?

更新:这很奇怪。我有Globals.h个文件,如果我在enum中定义了新的Globals.h,则会显示错误。然后,如果我注释掉enum,那么错误就会消失。这让我认为循环依赖已经存在了一段时间,并且添加enum以某种方式重新排序编译单元,从而暴露出之前不存在的依赖?

2 个答案:

答案 0 :(得分:3)

#ifndef标头防护不会阻止循环依赖。它只是在单个文件中防止同一标头的多个包含。

看起来像是对我的循环依赖。这意味着您在DataAudit.h中#include标题#include的DataAudit.h直接或间接。

答案 1 :(得分:2)

最后,我不确定我完全理解错误发生的原因,但这是我为解决它而做的,以及其他一些相关信息。也许这会帮助遇到这个问题的其他人。

  1. 对于项目中的每个头文件
    1. 标题中的每个#include "..."
      1. 如果#include中没有对该课程的引用,请将其删除。
      2. 如果只有指向#include中定义的类的指针,则将其替换为class ...前向声明。
      3. 如果在#include中定义了类的成员实例,并且使用指针并在堆上分配成员是有意义的,那么将成员更改为指针,并替换{{1}使用#include前向声明。
  2. 浏览我的class ....并将可以移出的任何内容移动到更多本地化和特定的头文件中。
    1. 具体而言,删除定义为Globals.h的{​​{1}},并将其放在更加本地化的头文件中。
  3. 完成所有这些后,我能够让错误消失。奇怪的是,enum中的Globals.h似乎是错误的催化剂。每当我从enum中删除它时,错误就会消失。我没有看到这个Globals.h如何导致错误,所以我认为它间接导致了错误。我仍然无法确切地知道如何或为什么,但它在使用C ++进行编码时帮助了我这个指南:

      

    除非需要在头文件中,否则不要放任何东西。别   将Globals.h中的任何内容放置在可以置于更本地化的位置   文件。基本上,尽你所能减少代码量   通过enum指令包含。