我收到此编译错误
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
以某种方式重新排序编译单元,从而暴露出之前不存在的依赖?
答案 0 :(得分:3)
#ifndef
标头防护不会阻止循环依赖。它只是在单个文件中防止同一标头的多个包含。
看起来像是对我的循环依赖。这意味着您在DataAudit.h中#include
标题#include
的DataAudit.h直接或间接。
答案 1 :(得分:2)
最后,我不确定我完全理解错误发生的原因,但这是我为解决它而做的,以及其他一些相关信息。也许这会帮助遇到这个问题的其他人。
#include "..."
#include
中没有对该课程的引用,请将其删除。#include
中定义的类的指针,则将其替换为class ...
前向声明。#include
中定义了类的成员实例,并且使用指针并在堆上分配成员是有意义的,那么将成员更改为指针,并替换{{1}使用#include
前向声明。class ....
并将可以移出的任何内容移动到更多本地化和特定的头文件中。
Globals.h
的{{1}},并将其放在更加本地化的头文件中。完成所有这些后,我能够让错误消失。奇怪的是,enum
中的Globals.h
似乎是错误的催化剂。每当我从enum
中删除它时,错误就会消失。我没有看到这个Globals.h
如何导致错误,所以我认为它间接导致了错误。我仍然无法确切地知道如何或为什么,但它在使用C ++进行编码时帮助了我这个指南:
除非需要在头文件中,否则不要放任何东西。别 将
Globals.h
中的任何内容放置在可以置于更本地化的位置 文件。基本上,尽你所能减少代码量 通过enum
指令包含。