#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
в большинстве мест.