嵌套类使用声明和访问修饰符

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

请查看实时演示

MSVC11 (v11.00.61030)无法编译此代码,报错如下:

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

GCC和Clang都可以正确编译此代码,因此我认为这是MSVC的一个错误,但没有相关标准部分的引用。

在MSVC中有解决方法吗?


我认为在编译时出现错误比以后遇到问题要好。 - Ali Kazmi
1
由于它是受保护的,标准的主函数将无法访问它。 - Ali Kazmi
3
@AliKazmi 什么被保护了?Derived 改变了 Nested 的访问修饰符;在这种情况下它不是被保护的。此外,在 Nestedvalue_enum 也不是被保护的。 - namezero
2
尝试在Derived类中使用typedef Base::Nested::value_enum value_enum; - Hrant
@Hrant MSVC 不会对 typedef Base::Nested Nested 报错(因为这只是一个 SSCCE,还有其他类型等等)。我“喜欢”这个想法作为一种解决方法。 - namezero
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接