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

gj5*_*gj5 39 c++ compiler-errors header

所以我有一个类包含在另一个类中,该类不断抛出"错误:'ProblemClass'形式的编译错误.文件是这样设置的:

#ifndef PROBLEMCLASS_H
#define PROBLEMCLASS_H

#include <iostream>
#include <cmath>

class ProblemClass
{
  public:

    virtual void Init() = 0;
};

#endif
Run Code Online (Sandbox Code Playgroud)

并且发生错误的类看起来像这样:

#ifndef ACLASS_H
#define ACLASS_H

#include "problemclass.h"

class AClass : public Base
{
  public:

    void DoSomething(ProblemClass* problem);

};

#endif
Run Code Online (Sandbox Code Playgroud)

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

我知道这里的代码不足以解决问题.我一直无法创建一个可以重现它的最小例子.所以我的问题更为笼统; 什么样的事情可能会导致这种情况?有什么特别的东西我应该寻找,或者我应该追踪一些调查线来跟踪它?

此代码在几乎完全相同的项目版本中编译良好.

无论多么模糊,都会非常感谢任何形式的帮助.我在win 7 64位中使用了mingw4.4.1的代码块10.05.

Bja*_*une 95

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

  • 您可能忘记在使用ProblemClass的文件中包含problemclass.h.
  • 你可能在自己的头文件或你正在使用它的地方错误拼写了ProblemClass的名称.如果它是大写错误,例如编写Problemclass或problemClass而不是ProblemClass,则很难发现这一点.
  • 您可以将包含保护#defines从一个头文件复制粘贴到另一个头文件,然后忘记更改定义的名称.然后只有这两个包含头文件中的第一个才会生效.
  • 您可以将ProblemClass放在命名空间A中,在这种情况下,如果您从命名空间A之外引用它,则必须将ProblemClass称为A :: ProblemClass.
  • 您可能正在使用模板而不期望两阶段查找以其工作方式工作.
  • 您可能拼错了包含中的文件名.如果您在拼写错误的名称下也有该文件的旧版本,则编译器不会报告该错误.
  • 你可以让ProblemClass成为一个只在你包含problemclass.h之后才被定义的宏,在这种情况下,你看到的ProblemClass被宏预处理器替换为其他东西.
  • 您可以在除problemclass.h之外的头文件中定义ProblemClass,然后problemclass.h实际上定义了其他内容.

    • 这是一个很好的清单.但是,我遇到了这个问题,而且我在ProblemClass.h中的for AClass中也指定了一个#include.因此,在编译ProblemClass.cc时,它会在处理ProblemClass.h头之前包含两个头.以为我会把它添加到列表中. (8认同)
    • 哇,谢谢,你救了我几个小时的头痛:) (3认同)
    • 谢谢,我的问题是命名空间! (2认同)

    Man*_*nik 32

    由于我的头文件/类中的循环依赖性,我有相同的错误消息:

    foo.hpp:

    #ifndef FOO_HPP
    #define FOO_HPP
    
    #include <stdio.h>
    #include "bar.hpp" // <-- here
    
    class Foo {
    public:
        int value = 0;
    
        void do_foo(Bar myBar) {
            printf("foo + %d\n", myBar.value);
        }
    };
    
    #endif //FOO_HPP
    
    Run Code Online (Sandbox Code Playgroud)

    bar.hpp:

    #ifndef BAR_HPP
    #define BAR_HPP
    
    #include <stdio.h>
    #include "foo.hpp" // <-- and here
    
    class Bar {
    public: 
        int value = 1;      
    
        void do_bar(Foo myFoo) {
            printf("bar = %d \n", myFoo.value);
        }
    };
    
    #endif //BAR_HPP
    
    Run Code Online (Sandbox Code Playgroud)

    使用:编译g++ -std=c++11 foo.hpp -o foo得到以下输出:

    In file included from foo.hpp:5:0:
    bar.hpp:11:15: error: ‘Foo’ has not been declared
    bar.hpp: In member function ‘void Bar::do_bar(int)’:
    bar.hpp:12:32: error: request for member ‘value’ in ‘myFoo’, which is of non-class type ‘int’
    
    Run Code Online (Sandbox Code Playgroud)

    • 循环依赖的解决方案:/sf/ask/43805961/ (2认同)