我的代码类似于以下内容:
class B
{
}
class A
{
enum {
EOne,
ETwo
} EMyEnum;
B myB;
}
我想在B类中声明一个类型为EMyEnum的成员(在A之前声明)。这可能吗?我意识到解决方案是将B类声明为秒,但为了清楚起见,我宁愿不这样做。
答案 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。