使用声明和访问修饰符的嵌套类
问题描述:
编译一些代码时,我遇到了一个编译器错误,这对我来说似乎很陌生,涉及到继承,嵌套类,声明和访问修饰符。使用声明和访问修饰符的嵌套类
基本上,意图是派生类型公开嵌套的基类型的受保护的类。
在以下短例子来说明这个问题:
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的方法?
答
对于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;
}
我想获得在编译时错误比对后一种问题,运行更好。 –
由于其受保护,通过标准主要功能将无法访问它 –
@AliKazmi什么是保护? 'Derived'改变'Nested'的访问修饰符;在这种情况下它不受保护。而且,'value_enum'在'Nested'内不受保护。 – namezero