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私は基本クラスを管理していないので、公開することはできません
  • Bとの新しい列挙型の間を変換するための巨大なswitch-caseステートメントは必要ありませんA::E

私はコードがうまくコンパイルされることを期待しています。

私は興味がある。コードがコンパイルに失敗する理由の科学的な説明は何ですか?

4

2 に答える 2

2

公開A::Eしても列挙子の名前には影響しないため、e引き続き保護されます。

追加で試すusingか、static const E e = A::eクラスに追加してくださいB

于 2013-02-25T10:16:56.747 に答える
1

これは、C++11 のスコープ セマンティクスを使用した完全に正気の C++ コードです。

int main()
{
    B::E enum1; // okay
    enum1 = B::E::e; // also okay
}
于 2013-03-04T20:45:56.670 に答える