【问题标题】:Access enumerator of an enum formerly declared as protected以前声明为受保护的枚举的访问枚举器
【发布时间】:2013-02-25 10:12:27
【问题描述】:

对于我的项目,我想扩大以前在基类中声明为受保护的枚举的可见性。

class A { 
protected:
    enum E { e = 0 };
};

class B : public A { 
public:
    using A::E;
};

int main()
{
    B::E enum1; // okay
    enum1 = B::e; // fails: test.cpp:3:14: error: A::E A::e is protected
}

原因很简单:

  • 我不控制基类,因此我不能只公开E
  • 我不想在B 和A::E 中的新枚举之间转换一个巨大的switch-case 语句

我希望(ed)代码编译得很好。

我很好奇。代码编译失败的科学解释是什么?

【问题讨论】:

  • 发布后 我注意到stackoverflow.com/questions/9814074/… 给出了足够好的推理。使用普通的 C++03 枚举不会引入新的范围,因此 enumerators 仍然会进入周围的范围。当然,定义“使用A::E”并不会改变这一事实,只会使枚举本身公开,而不是名称。

标签: c++


【解决方案1】:

将A::E 设为public 不会影响枚举数的名称,因此e 仍然受到保护。

尝试使用额外的using 或将static const E e = A::e 添加到类B。

【讨论】:

    【解决方案2】:

    这是使用 C++11 范围语义的完美 C++ 代码:

    int main()
    {
        B::E enum1; // okay
        enum1 = B::E::e; // also okay
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-20
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 2023-03-27
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多