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.
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!
The current C++ standard does not allow forward declarations of enum
s, although they will be coming in the upcoming C++0x standard.
See here for more info.
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.