views:

162

answers:

3

Hi all,

I have code similar to the following:

class B
{
}

class A
{
  enum {
     EOne,
     ETwo
  } EMyEnum;

  B myB;
}

I want to declare a member of type EMyEnum in class B (which is declared before A). Is this possible? I realise the solution is to declare class B second, but for clarity I would prefer not to.

+1  A: 

The current C++ standard does not allow forward declarations of enums, although they will be coming in the upcoming C++0x standard.

See here for more info.

Peter Alexander
A: 

You can declare A as template paramater of B. Second way to solve it is using int - it is known that c++ enum is int.

Dewfy
It is only known in C, in current C++, every integer type might be emitted by the compiler.
phresnel
@phresnel you are right, but I mean that it anyway could be casted to int
Dewfy
A: 

It's not possible... but it can be faked with inheritance abuse :)

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;
};

On the other hand... why don't you simply forward declare 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 };

Sure you need to actually write all the normally "default generated" methods of A, but hey that does not cost so much!

Matthieu M.
Yeah, the latter was what I ended up doing. Just needed to confirm that my preference wasn't possible:)
MM