Ошибка C2027 при попытке доступа к члену класса перечисления

#c #visual-c

Вопрос:

Мне трудно понять, как решить эту ошибку компилятора C2027: «Тип нельзя использовать, пока он не определен. Чтобы устранить ошибку, убедитесь, что тип полностью определен, прежде чем ссылаться на него».

Это процессор.h:

 // CPU.h
#include "Register.h"

class Register;

class CPU
{
public:
    static const enum class Flag { CARRY = 4, HALF_CARRY, SUBTRACT, ZERO };

private:
    Register A;
};
 

И это Регистрация.h:

 // Register.h
#include "CPU.h"

class CPU;

class Register 
{
    void foo(const CPU::Flagamp; flag); // error C2027
};
 

Итак, теперь я понимаю, что эта ошибка вызвана тем, что класс CPU еще не инициализирован, и я знаю о возможности поместить класс перечисления флагов за пределы класса CPU. Но мне интересно, есть ли другой вариант, чтобы я мог сохранить флаг внутри CPU.h
(для логических целей).

Спасибо 🙂

Комментарии:

1. Существует взаимная зависимость между определениями ваших классов. Нет другого выбора, кроме как сделать одно определение класса независимым от другого.

2. Теперь вопрос в том, почему Flag он является членом вашего CPU класса, а Register не является им. Это кажется совершенно произвольным.

3. Вам придется переместить перечисление из определения CPU класса в его собственный заголовок. Тогда Register.h будет включать CPUFlag.h , и CPU.h будет включать Register.h , и у вас не будет круговых включений. Затем вы могли class CPU { using Flag = CPUFlag; }; бы использовать и продолжать использовать CPU::Flag в большинстве мест.