【问题标题】:Accessing enum values defined in a struct访问结构中定义的枚举值
【发布时间】:2011-11-21 14:49:53
【问题描述】:

如果我有以下情况:

struct LineChartScene::LineChartSceneImpl
{
    enum ContextMenuAction {ShowLabels, ShowPoints, SaveAsImage};
};

如何在LineChartScene::LineChartSceneImpl 结构之外访问ShowLabelsShowPoints 等?我以为LineChartScene::LineChartSceneImpl::ContextMenuAction::ShowLabels 会起作用,但事实并非如此。我正在使用 C++,Qt Creator 2.2.1。

【问题讨论】:

    标签: c++ qt enums struct resolution


    【解决方案1】:
    struct LineChartScene::LineChartSceneImpl
    {
        enum ContextMenuAction {ShowLabels, ShowPoints, SaveAsImage};
    };
    

    把它当作

    LineChartScene::LineChartSceneImpl::ShowLabels
    

    为了您的信息,C++11 also has strong typed enums 与您所期望的命名空间语义完全相同:

    enum class Enum2 : unsigned int {Val1, Val2};
    

    枚举的范围也被定义为枚举名称的范围。使用枚举器名称需要明确范围。 Val1 未定义,但 Enum2::Val1 已定义。

    此外,C++11 将允许旧式枚举提供明确的作用域以及基础类型的定义:

    enum Enum3 : unsigned long {Val1 = 1, Val2};
    

    枚举器名称在枚举范围内定义 (Enum3::Val1),但为了向后兼容,枚举器名称也位于封闭范围内。

    【讨论】:

    • 感谢您的修复,@JoeMcGrath
    【解决方案2】:

    使用:

    LineChartScene::LineChartSceneImpl::ShowLabels
    

    请注意,该行中没有ContextMenuAction。这是因为枚举标签不在枚举type范围内,而是在定义枚举的封闭范围内,在这种情况下,封闭范围是类类型。我知道它非常不直观,但它就是这样设计的。

    【讨论】:

      【解决方案3】:

      您不需要枚举的名称,但您在正确的轨道上:

      LineChartScene::LineChartSceneImpl::ShowLabels
      

      【讨论】:

        【解决方案4】:

        只要LineChartScene::LineChartSceneImpl::ShowLabels

        【讨论】:

          猜你喜欢
          • 2021-05-21
          • 2012-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-23
          • 1970-01-01
          • 2011-07-03
          相关资源
          最近更新 更多