【问题标题】:Using value of enum within struct在结构中使用枚举值
【发布时间】:2019-02-21 13:36:32
【问题描述】:

我有以下课程:

class MyClass 
{
    public:

        enum myEnum
        {
            a = 0b0,
            b = 0b1,
        };

        union myUnion
        {
            uint32_t all;

            struct myStruct
            {
                uint32_t start     : 0b1;
                uint32_t enumValue : myEnum::a;
            } bits;
        };

    ...

};

我只是不确定如何在struct 中使用myEnum::a 的值。我尝试了多种引用该值的方法均无济于事。我将如何实现这一目标?

这是错误:Error: Name followed by "::" must be a class or namespace name in "MAX1300BEUG/MAX1300.h", Line: 50, Col: 37

谢谢, 亚当

【问题讨论】:

  • 首先,在定义枚举时,你应该使用逗号而不是分号。其次,您的 myEnum::a 为 0,这导致宽度开始为零。最后,您在 MyClass 定义之后缺少一个分号。
  • 1) 如果出现编译错误,为什么不包含它?是秘密吗? 2)我得到的错误when running your example与无法引用enum元素无关。为什么你认为是这样?
  • @YiFei 关于分号,你当然是正确的——这只是我的代码和问题之间的错字。你的意思是我需要定义myEnum::a的类型?
  • 我建议发布实际代码,或者至少发布您遇到的错误。您不需要定义类型,但位域enumValue 的宽度将为 0,这是 C++ 标准所不允许的。
  • @AlgirdasPreidžius 提供的错误消息和由于我写出问题而导致的语法错误已修复。

标签: c++ mbed


【解决方案1】:

myEnum::a 定义为0Zero width bit fields 在此上下文中是不允许的。

首先,修正您的拼写错误(其中有几个,您可以在问题的评论部分看到)。其次,不要尝试在这种情况下创建零宽度位字段。

【讨论】:

    【解决方案2】:

    枚举没有范围。因此将作用域解析运算符:: 应用于myEnum 是错误的。

    枚举值在封闭的命名空间中声明,因此在与myEnum在同一范围内的myStruct内,您可以使用非限定查找直接引用其值:ab

    MyClass之外,可以用MyClass::a解决。


    附: a 的值为 0。零宽度位域可能不会被命名。您正在尝试做的事情与您尝试通过这样做来实现的目标之间存在某种脱节。

    【讨论】:

    • 类型安全枚举 (enum class) do 有一个范围。也许将enum class 添加到您的答案中。
    • @JesperJuhl 我认为这超出了我的回答的范围。此时无需将 OP 与新概念混淆。我不认为作用域枚举对他来说是一个好的选择,因为他打算直接使用数值。
    【解决方案3】:

    这里有很多事情要做,所以我会尝试一次解决这些问题。

    枚举值范围解析 - 在 C++ 中,枚举的值在与枚举相同的范围内声明(与 C# 不同,其中枚举是其值的命名空间)。枚举值的完全限定范围是 ::MyClass::a::MyClass::b。可以省略与引用代码的范围共享的完全限定范围中的所有前缀组件,只要省略不会导致所需的值被另一个同名值隐藏。因此在上面的示例中,您可以将值称为ab

    另一个问题是 MyClass::myStruct::enumValue 被声明为长度为零的位字段,因为 MyClass::a 的数值为 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2012-10-24
      相关资源
      最近更新 更多