2013-02-25 67 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 
}