错误:尽管包含标头,但尚未声明类,并且代码在其他地方编译良好

新手上路,请多包涵

所以我有一个包含在另一个类中的类,它不断抛出形式为“错误:’ProblemClass’没有被声明的编译错误。文件是这样设置的:

 #ifndef PROBLEMCLASS_H
#define PROBLEMCLASS_H

#include <iostream>
#include <cmath>

class ProblemClass
{
  public:

    virtual void Init() = 0;
};

#endif

发生错误的类如下所示:

 #ifndef ACLASS_H
#define ACLASS_H

#include "problemclass.h"

class AClass : public Base
{
  public:

    void DoSomething(ProblemClass* problem);

};

#endif

编译错误发生在 void Dosomething();

我知道这里的代码不足以解决问题。我一直无法创建一个可以重现它的最小示例。所以我的问题要笼统得多;什么样的事情可能会导致这种情况?有什么我应该特别寻找的,或者我应该遵循一些查询来追踪它吗?

此代码在项目的几乎相同版本中编译得很好。

任何形式的帮助将不胜感激,无论多么模糊。我在 win 7 64 位中使用带有 mingw4.4.1 的代码块 10.05。

原文由 gj5 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 235
2 个回答

您似乎在说您显示的代码实际上并没有产生您遇到问题的编译器错误。所以我们只能猜测。以下是一些可能性:

  • 您可能忘记在使用 problemclass.h 的文件中包含 ProblemClass
  • 您可能在自己的头文件或您使用它的地方拼错了 ProblemClass 的名称。如果这是一个大写错误,例如写 ProblemclassproblemClass 而不是 ProblemClass ,这可能很难发现。
  • 您可能已经将包含保护 #defines 从一个头文件复制粘贴到另一个头文件,然后忘记更改定义的名称。然后只有这两个包含的头文件中的第一个才会生效。
  • You could have placed ProblemClass in a namespace A , in which case you must refer to ProblemClass as A::ProblemClass if you are referring to it从命名空间 A 之外。
  • 您可能正在使用模板,并且不希望两阶段查找能够以 的方式工作。
  • 您可能拼错了包含中的文件名。如果您在拼写错误的名称下还有该文件的旧版本,编译器不会报告错误。
  • 您可以制作 ProblemClass 一个仅在您包含 problemclass.h 后定义的宏,在这种情况下,您所看到的 ProblemClass 被宏替换为其他内容预处理器。
  • 您可以在 --- 以外的头文件中定义 ProblemClass problemclass.h problemclass.h 实际上定义了其他内容。

原文由 Bjarke H. Roune 发布,翻译遵循 CC BY-SA 4.0 许可协议

有同样的问题,Ah 包含在 B1.h 和 B2.h B2.h 也包含在 B2.cpp

在课堂上使用过#Pragma 一次啊,这解决了这个问题。

原文由 Raghavendra J 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题