6

コンパイルエラーに遭遇したいくつかのコードをコンパイルしながら、私には奇妙に思え、継承、ネストされたクラス、宣言とアクセス修飾子に関連するコードをコンパイルします。宣言とアクセス修飾子を使用するネストされたクラス

基本的に、派生型は、基本型のネストされた保護クラスを公開することを意図しています。

問題を実証するために、次の短い例:

class Base 
{ 
protected: 

    struct Nested 
    { 
     enum value_enum 
     { 
      val = 0, 
      val2, 
      val3 
     }; 
    }; 

}; 

class Derived : public Base 
{ 
public: 

    using Base::Nested; 
}; 


int main(int argc, char** argv) 
{ 
    //Base::Nested aa; // error, as (I) expected 
    //Base::Nested::value_enum ab; // error, as (I) expected 

    Derived::Nested ba; // works, as (I) expected 
    Derived::Nested::value_enum bb; // MSVC error, as (I) did not expect 


    return 0; 
} 

liveを参照してください。

MSVC11(v11.00.61030)は、次のエラーで、このコードにチョーク:標準から関連部分を引用する能力なしで、私は主張よう

error C2248: 'Base::Nested' : cannot access protected struct declared in class 'Base'

GCCとクラン両方は、適切にこれをコンパイルこれはMSVCのバグです。

MSVCでこれを回避する方法はありますか? MSVCのために

+0

私はコンパイル時にエラーを取得すると、後者の問題にして実行されているよりも優れていると思います。 –

+1

保護されているため、標準のメイン機能ではアクセスできません。 –

+3

@AliKazmi保護されているものは何ですか? 'Derived'は' Nested'のアクセス修飾子を変更します。この場合は保護されていません。また、 'value_enum'は' Nested'の内部では保護されていません。 – namezero

答えて

1

次の回避策は動作します:

class Derived : public Base 
{ 
    public: 

    using Base::Nested; 
    typedef Base::Nested::value_enum value_enum; // add this 
}; 

int main(int argc, char** argv) 
{ 
    //Base::Nested aa; // error, as (I) expected 
    //Base::Nested::value_enum ab; // error, as (I) expected 

    Derived::Nested ba; // works, as (I) expected 
    Derived::value_enum bb = Derived::value_enum::val; // now works in MSVC 


    return 0; 
} 
関連する問題