在编译一些代码时,我遇到了一个编译器错误,它与继承、嵌套类、使用声明和访问修饰符有关,这对我来说似乎很奇怪。
基本上,意图是使派生类型公开基类型的保护嵌套类。
以下是一个简短的示例,用于演示此问题:
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;
}
请查看实时演示。
MSVC11 (v11.00.61030)无法编译此代码,报错如下:
error C2248: 'Base::Nested' : cannot access protected struct declared in class 'Base'
GCC和Clang都可以正确编译此代码,因此我认为这是MSVC的一个错误,但没有相关标准部分的引用。
在MSVC中有解决方法吗?
Derived
改变了Nested
的访问修饰符;在这种情况下它不是被保护的。此外,在Nested
中value_enum
也不是被保护的。 - namezeroDerived
类中使用typedef Base::Nested::value_enum value_enum;
。 - Hranttypedef Base::Nested Nested
报错(因为这只是一个 SSCCE,还有其他类型等等)。我“喜欢”这个想法作为一种解决方法。 - namezero