Форвардное объявление вложенного перечисления - PullRequest
16 голосов
/ 10 февраля 2010

У меня есть код, подобный следующему:

class B
{
}

class A
{
  enum {
     EOne,
     ETwo
  } EMyEnum;

  B myB;
}

Я хочу объявить член типа EMyEnum в классе B (который объявлен до A). Это возможно? Я понимаю, что решение состоит в том, чтобы объявить класс B вторым, но для ясности я бы предпочел этого не делать.

Ответы [ 3 ]

11 голосов
/ 11 февраля 2010

Это невозможно ... но может быть подделано с помощью наследования:)

namespace detail
{
  class A_EMyEnum
  {
  public:
    enum {
       EOne,
       ETwo
    } EMyEnum;

  protected:
    A_EMyEnum() {}
    A_EMyEnum(const A_EMyEnum&) {}
    A_EMyEnum& operator=(const A_EMyEnum&) { return *this; }
    ~A_EMyEnum() {}
  }; // class A_EMyEnum
} // namespace detail

class B { // use detail::A_EMyEnum };

class A: public detail::A_EMyEnum
{

  B mB;
};

С другой стороны ... почему бы вам просто не объявить B?

class B;

class A
{
public:
  enum EMyEnum {};

  A();
  A(const A&);
  A& operator=(const A&);
  ~A();
  void swap(A&);

private:
  B* mB;
};

class B { // use A::EMyEnum };

Конечно, вам нужно написать все обычно «генерируемые по умолчанию» методы A, но эй, это не так дорого стоит!

2 голосов
/ 10 февраля 2010

Текущий стандарт C ++ не допускает предварительных объявлений enum s, хотя они будут поступать в следующем стандарте C ++ 0x.

См. здесь для получения дополнительной информации.

0 голосов
/ 10 февраля 2010

Вы можете объявить A как параметр шаблона B. Второй способ решить эту проблему - использовать int - известно, что перечисление c ++ - это int.

...