考虑以下代码:
#include<iostream>
enum week
{
sun=1,
mon,
tue,
wed,
thr,
fri,
sat
};
week &operator++(week& day,int)
{
if(day==sat)
day=sun;
else
day++; // This expression
return day;
}
int main()
{
week day=sun;
for(int i=0;i<=10;i++,day++)
{
std::cout<<day;
}
}
在表达式day++
中,它可以进行无限递归。
如果我将其像((int)day)++
那样投射,则编译器会出现以下错误:
error: lvalue required as increment operand
如果我将行更改为day=week(((int)day)+1)
,它将起作用。但是如何修复上面的代码,使其与++
运算符配合使用?
答案 0 :(得分:5)
默认的增量运算符不适用于枚举。您将不得不重载增量运算符(使用您的week(((int)day)+1)
逻辑)并改为处理该重载函数中的环绕。
答案 1 :(得分:4)
(int)day
返回一个int,您尝试使用++运算符对其进行递增。因此,基本上您会做类似... = 5++
的事情,这是不合法的。
答案 2 :(得分:4)
解决编译器错误的一种方法是强制转换为引用
((int&)day)++;
但是您应该注意enum
的后备类型是int
:
enum week : int
{
// and so on
如果那不是您的喜好,而是希望编译器为您确定支持的类型,则使用
((std::underlying_type<week>::type&)day)++;