Использование неопределенного типа, хотя упреждающее объявление есть

Рейтинг: -1Ответов: 1Опубликовано: 07.07.2023

Стивен Пратта язык программирования C++ страница 812, листинг 15.4 visual studio 2022 прям с книжки заполнил, но почему то когда с открытого enum использую значение, то пишет что необъявленный идентификатор. то есть TV/Tv::TV неизвестен, хотя класс объявлен за ранее, что бы был виден Remot'у. И пытался в отдельном заголовочном файле делать, но ошибка та же самая.

class Tv;
class Remote {
private:
    int mode; 
    public:
    Remote(int m = TV); //прям с книги, но IDE ругается: "идентификатор не определен"
    ...   //заменил на Tv::TV ругается уже компилятор: "необъявленный идентификатор"
};
        
class Tv {
    //friend class Remote;
    friend void Remote::set_ch(Tv& t, int c);
public:
    enum{TV, DVD};
    ...
};

Подскажите пожалуйста, почему такое может происходить?

Ответы

▲ 2Принят

Если посмотреть листинг 15.4 из упомянутой вами книги полностью, то можно обнаружить, что класс Remote тоже имеет перечислимое значение TV:

class Remote {
public:
    enum State {Off, On};
    enum {MinVal, MaxVal=20};
    enum {Antenna, Cable}      //В моём экземпляре книги точка с запятой здесь отсутствует, хотя должна быть.
    enum {TV, VCR};
private:
    int mode; 
public:
    Remote(int m = TV) : mode(m){}
};

Получается, значение TV, принимаемое по умолчанию для параметра конструктора m, берётся из класса Remote, а не Tv.