Использование перечисления из объявленного заранее класса - PullRequest
0 голосов
/ 28 января 2020

Текущая проблема:

Мне нужен доступ к перечислению из класса, который объявлен в прямом направлении , аналогично этой ситуации:

Human.h

#include "Dog.h"
class Human{
public:
  enum Language: uint32_t {
    None = 0,
    English = 1,
    Japanese= 2,
  };
}

Dog.h

class Human;

class Dog{
   void understand(Human::Language speech);
}

Dog.cxx

#include "Dog.h"
#include "Human.h"

void Dog::understand(Human::Language speech) {  
   // Do stuff with Human::Language
   return;
}

Ошибки:

  • Среда IDE сообщает, что реализация Dog.cxx не совместима с замедлением Dog.h, указав перечисление как <erro-type> в подсказке об ошибке (только красный squiggle)
  • При компиляции любое упоминание перечисления в Dog.h / c .xx выдает ошибки, не удается найти перечисление

Extra Информация:

  • MSV C 15 2017
  • Полная архитектура программы требует, чтобы перечисление было таким, как это
  • Прямое замедление является обязательным в порядке решить круговую зависимость внутри моей программы, которая здесь не видна

1 Ответ

1 голос
/ 28 января 2020

По сути, ответ отрицательный, вы не можете объявить перечисление в этом контексте. Вы можете выбрать:

  1. Перевести перечисление в легкий базовый класс.
struct HumanBase
{
  enum Language: uint32_t {
    None = 0,
    English = 1,
    Japanese= 2,
  };
};

//fwd declare
struct Human;
Переместите перечисление из класса.
enum HumanLanguage : uint32_t {
  None = 0,
  English = 1,
  Japanese= 2,
};
struct Human;

, а затем, если вам потребуется позже, вы можете сделать:

struct Human
{
  typedef HumanLanguage Language;
};
Измените все методы, которые используют перечисление, чтобы быть шаблоном (который может работать в некоторых случаях, возможно, не в других)
class Dog{
   template<typename LanguageType)
   void understand(LanguageType speech);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...