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和Clang的編譯這個正確的,所以不從標準引用相關部件的能力,我認爲這是一個MSVC錯誤。

有沒有解決這個MSVC的方法?

+0

我想獲得在編譯時錯誤比對後一種問題,運行更好。 –

+1

由於其受保護,通過標準主要功能將無法訪問它 –

+3

@AliKazmi什麼是保護? 'Derived'改變'Nested'的訪問修飾符;在這種情況下它不受保護。而且,'value_enum'在'Nested'內不受保護。 – namezero

回答

1

對於MSVC以下變通辦法:

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; 
}