2013-02-25 70 views
1

对于我的项目,我想扩大先前在基类中声明为受保护的枚举的可见性。先前声明为受保护的枚举的访问枚举器

class A { 
protected: 
    enum E { e = 0 }; 
}; 

class B : public A { 
public: 
    using A::E; 
}; 

int main() 
{ 
    B::E enum1; // okay 
    enum1 = B::e; // fails: test.cpp:3:14: error: A::E A::e is protected 
} 

造成这种情况的原因很简单:

  • 我不控制的基类,所以我不能只是让E公共
  • 我不想要一个巨大的switch-case语句在BA::E

一个新的枚举之间的转换,我期望(ED)的代码编译就好了。

我很好奇。代码无法编译的科学解释是什么?

+0

*后*张贴这我已经注意到,http://stackoverflow.com/questions/9814074/rationale-behind- enum-access-semantics-in-c?rq = 1给出了足够好的推理。使用简单的C++ 03枚举不会引入新的作用域,因此*枚举符*仍然会转到周围的作用域。定义“使用A :: E'”当然不会改变这个事实,并且只是使枚举本身公开,而不是名称。 – kfunk 2013-02-25 10:28:47

回答

2

制作A::E public不会影响枚举器的名称,所以e仍然受到保护。

请尝试其他using或将static const E e = A::e添加到类B

1

这是使用C++ 11的作用域语义完全理智的C++代码:

int main() 
{ 
    B::E enum1; // okay 
    enum1 = B::E::e; // also okay 
}