У меня возникла похожая проблема, и мне потребовалось некоторое время, чтобы выяснить, почему.
В вашем случае вы можете определить PROBLEMCLASS_H в некоторых других заголовочных файлах.
В результате ваш файл cpp пропустит определение в заголовочном файле. Другими словами, строка #include "problemclass.h"
пропускается.
В моем случае я использую MingW64 под Linux. Скажем, у меня есть заголовочный файл IO.h:
// IO.h
#ifndef _IO_H_
#define _IO_H_
class A{
...
};
#endif
В моем файле main.cpp:
// main.cpp
#include <unistd.h>
#include "IO.h"
int main(int argc, char** argv) {
//...
}
Файл cpp выглядит невинно. Однако, когда unistd.h
включен, он тайно включает /usr/i686-w64-mingw32.static/include/io.h
, предоставленный MingW, и это io.h
выглядит следующим образом:
// io.h
#ifndef _IO_H_
#define _IO_H_
...
#endif /* End _IO_H_ */
Теперь вы можете видеть, что включение unistd.h
приведет к включению io.h
от MingW, и это скроет мой собственный IO.h. Я думаю, что это такая же проблема, как у вас.
Если вы переключаете порядок включений (ставьте #include <unistd.h>
после IO.h), программа компилируется. Но это не очень хорошее предложение. Я рекомендую вам не использовать _IO_H_ для защиты своего собственного IO.h.
Чтобы понять, как / почему ваш PROBLEMCLASS_H
включен, я согласен с @greatwolf, вы можете использовать g++ -E
, чтобы вывести выходные данные препроцессора и проверить его вручную. Проверьте, какие файлы включены до вашего PROBLEMCLASS_H
и в каком порядке они включены. Я надеюсь, что это может помочь решить вашу проблему.