嵌套枚举的前向声明

时间:2010-02-10 15:51:49

标签: c++ enums nested forward-declaration

我的代码类似于以下内容:

class B
{
}

class A
{
  enum {
     EOne,
     ETwo
  } EMyEnum;

  B myB;
}

我想在B类中声明一个类型为EMyEnum的成员(在A之前声明)。这可能吗?我意识到解决方案是将B类声明为秒,但为了清楚起见,我宁愿不这样做。

3 个答案:

答案 0 :(得分:11)

这是不可能的......但它可以伪造继承滥用:)

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的所有正常的“默认生成”方法,但嘿,这不会花费太多!

答案 1 :(得分:2)

当前的C ++标准不允许enum的前向声明,尽管它们将在即将到来的C ++ 0x标准中出现。

有关详细信息,请参阅here

答案 2 :(得分:0)

您可以将A声明为B的模板参数。 解决它的第二种方法是使用int - 众所周知,c ++枚举是int。