looogle
@looogle
Программист-любитель на C++ и по жизни.

Почему компилятор выдаёт ошибку «not a type» при использовании forward declaration?

Доброго времени суток, тостеровчане.

У меня есть два заголовочных файла с исходным кодом:

report.h
#ifndef __REPORT_H
#define __REPORT_H

namespace HidDevice {

class Device;

class Report {
    // реализация родительского класса
};

struct SetModeReport : public Report {
    public:
        SendModeReport() :
                Report(M_REPORT, M_REPORT_LEN),
                mode(Device::Mode::UNDEFENDED)
        { };

        ~SendModeReport() { };

        Device::Mode mode;

        // остальные методы и поля

    private:
        // приватная область
};

}; // HidDevice namespace

#endif //__REPORT_H


hidDevice.h
#ifndef __HID_H
#define __HID_H

#include "report.h"

namespace HidDevice {

class Device
{
public:

    //! List of HID device states
    enum Mode {
        NORMAL = 0,             /*!< Mode of sending angles */
        CALIB_WHEEL,            /*!< Calibration wheel mode */
        CALIB_RUDDER,           /*!< Calibration rudder mode */
        SAVE_TABLE_WHEEL,       /*!< Save wheel calibration into flash memory */
        SAVE_TABLE_RUDDER,      /*!< Save rudder calibration into flash memory */
        END_SAVE_TABLE,         /*!< End of table saving */
        CALC_CRC,               /*!< Calculate CRC of both tables */
        END_CALC_CRC,           /*!< End of calculating CRC */
        UNDEFENDED              /*!< "Do nothing" mode */
    };

    void sendData(Report& report);
    // другие поля и методы
};

}; // HidDevice namespace

#endif //__HID_H


Собственно после попытки компиляции компилятор ругается следующим образом:
inc\hid\report.h|97|error: 'Mode' in 'class HidDevice::Device' does not name a type|


Хотя, вроде как, для предотвращения именно этой ошибки я использовал forward declaration в файле report.h:
namespace HidDevice {

class Device;

....

}; // HidDevice namespace


Что я делаю не так?
  • Вопрос задан
  • 1709 просмотров
Решения вопроса 1
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Вам нужно использовать scoped enum из C++11, их, в числе прочего, можно форвардно объявлять. В этом случае перечисление можно из класса вынести.
Если нет возможности включить поддержку C++11, то придется явно инклудить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы