枚举类型的运算符重载

时间:2019-12-16 14:22:15

标签: c++

考虑以下代码:

#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),它将起作用。但是如何修复上面的代码,使其与++运算符配合使用?

3 个答案:

答案 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)++;