课堂"enum - invalid conversion from int"

"enum - invalid conversion from int" in class

本文关键字:from int conversion enum 课堂 invalid      更新时间:2023-10-16

我在将方法参数放到我的类中时遇到问题:

class A {
  public:
    enum Mode {ModeA, ModeB, ModeC};
    ... // other methods, constructor etc
    void setMode(Mode m) {
      mMode = m;
    }
  private:
    Mode mMode;
}
int main(int argc, char **argv) {
  A a;
  a.setMode(A::ModeA | A::ModeC );
  return 0;
}

问题,我得到一个C++编译器错误invalid vconversion from int to A::Mode,我不明白,为什么我不能连接枚举值?我需要在我的代码,所以解决这个问题的任何帮助都会非常好。

默认情况下,两个枚举的operator|结果不是枚举。下课后,添加如下内容:

A::Mode operator|( A::Mode a, A::Mode b )
{
    return A::Mode( int( a ) | int( b ) );
}

如果您的标准库支持它,则以下内容更适合未来,因为转换为 int 并不总是正确的:

A::Mode operator|( A::Mode a, A::Mode b )
{
    typedef std::underlying_type< A::Mode >::type UL;
    return A::Mode( static_cast< UL >( a ) | static_cast< UL >( b ) );
}

与其他答案不同,您只需将其添加一次(到正确的位置),所有用途都会自动覆盖。

也许你需要这个:

a.setMode( (A::Mode) (A::ModeA | A::ModeC ));

A::ModeA | A::ModeC做了一个int所以再次投掷到A::Mode

在这种情况下

enum的基础类型可能是int,并且编译器不能依赖于使用|(按位或)构造的标志是此枚举中的有效值。

但是,您知道结果将是此枚举的有效值,因此您可以执行以下操作:

A::Mode newMode = (A::Mode) (A::ModeA | A::ModeC);
a.setMode(newMode);