So I have a class included in another class that keeps throwing a compile error of the form "error: 'ProblemClass' has not been declared. The files are set up thusly:
#ifndef PROBLEMCLASS_H
#define PROBLEMCLASS_H
#include <iostream>
#include <cmath>
class ProblemClass
{
public:
virtual void Init() = 0;
};
#endif
and the class where the error occurs looks like this:
#ifndef ACLASS_H
#define ACLASS_H
#include "problemclass.h"
class AClass : public Base
{
public:
void DoSomething(ProblemClass* problem);
};
#endif
The compile error occurs at void Dosomething();
I'm aware the code here isn't enough to solve the problem. I've been unable to create a minimal example that can reproduce it. So my question is much more general; what sort of things might cause this? Is there anything in particular I should look for, or some line of enquiry I should be following to track it down?
This code compiles fine in an almost identical version of the project.
Help of any sort would be greatly appreciated, no matter how vague. I'm using codeblocks 10.05 with mingw4.4.1 in win 7 64 bit.
I've had that same error message as a result of a circular dependency in my header files / classes:
foo.hpp:
bar.hpp:
Compiling with:
g++ -std=c++11 foo.hpp -o foo
resulted in the following output:I had the same problem and I've discovered what I was doing wrong: following your example, I've included ProblemClass in AClass, thus causing the problem.
You seem to be saying that the code you are showing doesn't actually produce the compiler error that you are having a problem with. So we can only guess. Here are some possibilities:
I have experienced a similar problem and it took me a while to find out why.
In your case, you may define PROBLEMCLASS_H in some other header files. The consequence is your cpp file will skip the definition in the header file. In other words, the line
#include "problemclass.h"
is skipped.In my case, I am using MingW64 under Linux. Say I have a header file IO.h:
In my main.cpp file:
The cpp file looks innocent. However, when
unistd.h
is included, it secretly includes/usr/i686-w64-mingw32.static/include/io.h
supplied by MingW, and thisio.h
looks like:Now you can see that inclusion of
unistd.h
will lead to the inclusionio.h
from MingW, and that will hide my own IO.h. I guess that's a similar problem like yours.If you switch the order of includes (put
#include <unistd.h>
after IO.h), the program compiles. But this is not a good suggestion. I recommend that you don't use _IO_H_ to guard your own IO.h.To understand how/why your
PROBLEMCLASS_H
is included, I agree with @greatwolf, you can useg++ -E
to output the preprocessor output and manually examine it. Check what files are included before yourPROBLEMCLASS_H
and in what order they are included. I hope that can help solve your problem.Please post the command you are using for compilation. I've seen this issue if you have 2 separate files that include the same header and you are doing a gcc *.cpp. This happens because the #define gets defined for the entire gcc instance and not just for each individual object file being compiled.
Ex.
File1
Then two separate files that reference it.
Trying to compile all at the same time will cause one of the cpp files to fail since FILE1_HPP was already defined (causing the header file to be ignored for that cpp file).
Answer is either remove the #ifndef, or to compile each file into its own object files and then link them into your main application.
To anyone seeing this post and having this error, I want to point out that this frequently happens to me when I forget to add the class specifier before a function name, wherein that class function uses something privately defined in the class's header.
EG:
Header
Source (Will throw error SomeType_t is not defined)
Source (Fixed)
This is a dumb, but really easy mistake to make and not see until after you have given yourself three concussions from hitting your head against the desk.