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