c++ - 使用声明和访问修饰符的嵌套类

标签 c++ visual-studio-2012 nested-class access-modifiers compiler-bug

在编译一些代码时,我遇到了一个编译器错误,这个错误对我来说很奇怪,并且与继承、嵌套类、使用声明和访问修饰符有关。

基本上,派生类型的目的是公开基类型的嵌套 protected 类。

以下简短示例演示了该问题:

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

关于c++ - 使用声明和访问修饰符的嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32436466/

相关文章:

android - Xamarin:进度条改变颜色

java - 内部类与静态嵌套类的 GC 性能下降

java - 将类嵌套在接口(interface)中是个好主意吗?

c++ - 为什么我们在大括号前需要分号?

C++ 丢弃限定符

visual-studio-2012 - Resharper 8.1 Test Runner 减慢了 Visual Studio 文本编辑的速度

asp.net - 使用 TFS 进行 MSBuild 在使用多个项目进行 ASP.NET 部署时失败

wpf - 在 XAML 中创建嵌套类的实例

c++ - 'ofstream' 和 'fstream' 读取文件

c++ - 我可以提供对 OpenCV 矩阵的只读访问吗?