我复制并粘贴了一些递增枚举的代码:
myenum++;
这段代码在VS.NET C++ 2003中编译时运行良好我现在在VS 6.0中开发,得到了错误:错误C2676:二进制'++':“enum ID”未定义此运算符或到预定义运算符可接受的类型的转换我怎样才能让它在6.0中表现得一样?
ulydmbyx1#
我认为在一个很好理解的枚举上定义operator没有什么错。这不就是操作符重载的目的吗?如果上下文没有意义(例如,一个有洞的枚举),那么它当然没有意义。为一个名为Complex的类定义运算符 * 来实现复数不仅是有效的,而且是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; }
w80xi6nr2#
枚举可以是整数,但并不意味着它覆盖了连续的范围。这
enum { A, B, C, }
5月将默认为
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两次吗?迭代枚举的目的是什么?你想做的是“为所有”还是为一些子集,实际上有一个顺序的枚举?我会把它们都扔到一个容器里,
yks3o0rb3#
请尝试转换为int,加一(+1)并转换回枚举。
5gfr0r5j4#
myenum=(myenum_type)((int)myenum+1);
它很丑,但它工作。
dw1jzc5e5#
enum xyz { a, b, c}; xyz val = a; //try this val = xyz(val +1);
5条答案
按热度按时间ulydmbyx1#
我认为在一个很好理解的枚举上定义operator没有什么错。这不就是操作符重载的目的吗?如果上下文没有意义(例如,一个有洞的枚举),那么它当然没有意义。为一个名为Complex的类定义运算符 * 来实现复数不仅是有效的,而且是C中数学运算符重载的一个很好的应用!
如果开发人员定义了一个枚举,其中operator++对该枚举的客户端具有明显和直观的意义,那么这就是该操作符重载的一个很好的应用。
w80xi6nr2#
枚举可以是整数,但并不意味着它覆盖了连续的范围。
这
5月将默认为
这样你就可以
但如果你有
现在+1是行不通的。
现在,如果你也有类似的东西,
那么当迭代枚举时,你会做A和C两次吗?
迭代枚举的目的是什么?你想做的是“为所有”还是为一些子集,实际上有一个顺序的枚举?
我会把它们都扔到一个容器里,
yks3o0rb3#
请尝试转换为int,加一(+1)并转换回枚举。
5gfr0r5j4#
它很丑,但它工作。
dw1jzc5e5#