【问题标题】:How do I increment an enum in VS C++ 6.0?如何在 VS C++ 6.0 中增加枚举?
【发布时间】:2010-06-23 22:28:18
【问题描述】:

我复制并粘贴了一些增加枚举的代码:

myenum++;  

这段代码运行良好,因为它是在 VS.NET C++ 2003 中编译的

我现在在 VS 6.0 中开发并得到错误:

错误 C2676: 二进制 '++' : 'enum ID'没有定义这个 运算符或转换为类型 预定义运算符可接受

我怎样才能让它在 6.0 中表现相同?

【问题讨论】:

  • 为枚举类型重载operator++ 的两个版本?

标签: c++ c visual-studio compiler-construction enums


【解决方案1】:

我认为在一个很好理解的枚举上定义 operator++ 并没有错。这不是运算符重载的目的吗?如果上下文没有意义(例如,其中有孔的枚举),那么它当然没有意义。为实现复数的 Complex 类定义 operator* 不仅有效,而且是 C++ 中数学运算符重载的一个很好的应用!

如果开发人员定义了一个枚举,其中 operator++ 对该枚举的客户端具有明显和直观的意义,那么这就是该运算符重载的一个很好的应用。

enum DayOfWeek {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
inline DayOfWeek operator++(DayOfWeek &eDOW, int)
{
   const DayOfWeek ePrev = eDOW;
   const int i = static_cast<int>(eDOW);
   eDOW = static_cast<DayOfWeek>((i + 1) % 7);
   return ePrev;
}

【讨论】:

  • 我只是想问这个问题(但先搜索)。我想使用一些枚举来区分用于各种事物的整数,以防止意外的交叉分配(例如物理块号和虚拟块号之间),但仍然允许“for”循环。定义否则不适用于枚举的运算符是一个完美的解决方案。
  • 不应该是DayOfWeek operator++(DayOfWeek &amp; eDOW, int)和定义略有不同吗?
【解决方案2】:

枚举可能是整数,但并不意味着它涵盖了一个连续的范围。

这个

enum {
  A, 
  B,
  C,
}

May 将默认为

enum {
  A = 0, 
  B = A + 1,
  C = B + 1,
}

这样你就可以逍遥法外了

int a = A;
a++;

如果你有

enum {
  A = 2, 
  B = 4,
  C = 8,
}

现在 +1 行不通了。

现在,如果你也有类似的东西

enum {
  FIRST,
  A = FIRST, 
  B,
  C,
  LAST = C
}

那么在迭代枚举时你会做两次 A 和 C 吗?

迭代枚举的目的是什么?你想“为所有人”做还是为某个子集做,实际上对枚举有一个顺序吗?

我会将它们全部放入一个容器中并对其进行迭代

  • 无序 - 使用集合
  • 有序 - 一个向量或列表

【讨论】:

  • 谢谢。当我读入一个文件时,它会跟踪一些 ID。枚举的顺序为 0-95,每个值都有一个有效的 var。接下来我会查看一个矢量列表。
  • 只是一个小问题。不是enum { A, B, C}, 可能默认为enum { A=0, B=A+1, C=B+1,},而是它默认为这些值(如果不是,则不符合)。
【解决方案3】:

请尝试转换为 int,加一 (+1) 并转换回枚举。

【讨论】:

  • 有什么好的转换方法吗?这是建议的吗? stackoverflow.com/questions/367819/…
  • enumTypeVariable = (enumtype)(1+(int)enumTypeVariable)
  • 将 1 添加到表示为 int 的枚举中并不能保证您将获得另一个有效的枚举值。
  • @Greg:枚举可以转换成其他类似行为的 C++ 数据结构吗?
  • @Greg:有效的枚举值,即可以“强制”进入枚举对象的值包括枚举范围内的所有整数值,四舍五入到最接近的 2 的较大幂。换句话说,仅仅因为您获得的值在枚举定义中没有名称,确实不一定意味着该值无效。只要你在范围内,所有的值都是有效的。
【解决方案4】:
myenum=(myenum_type)((int)myenum+1);

虽然很丑,但是很管用。

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多