【问题标题】:Operator overloading for enum increment枚举增量的运算符重载
【发布时间】:2017-08-09 02:32:37
【问题描述】:

我有这个枚举,我只是想将该枚举的一个对象增加一个位置。

enum Month {
    january = 1,
    february,
    march,
    april,
    may,
    june,
    july,
    august,
    september,
    october,
    november,
    december
};

对于我的枚举对象 Month m,我只想将对象的变量移动一个位置。

Month operator++(Month &m) {
        m = static_cast<Month>(m + 1);
        return m;
    }

以 Month &m 作为参数,我得到错误,它需要将 int 作为参数。因此,如果我执行“(Month &m, int)”,则表示它“必须接受零个或一个参数”。我读到如果您的运算符重载是成员函数,则不需要 Month &m,因此我将其删除。之后,我又收到一个错误:“'operator++' 不匹配(操作数类型为'Month')”。有什么我遗漏的吗?

主要代码:

class Date {
    int y, d, month_end; // private
    Month m;

    public:
        Date(int yy, Month mm, int dd) 
        : y(yy), d(dd), m(mm) { 
        }

        Month& operator++(Month &m) { 
            m = static_cast<Month>(m + 1);
            return m;
        }

        void add_month() {
            ++m;
        }

【问题讨论】:

  • 您使用的是哪个编译器?适用于 MS vs14。请出示您的Main( )
  • @lakeweb gcc 版本 6.4.0 20170704 (Debian 6.4.0-1) 我实际上并没有使用运算符重载在 main 中调用任何东西,但我会将它添加到原始问题中。
  • @sS5H 我认为lakeweb 评论的含义是让您创建一个Minimal, Complete, and Verifiable example
  • @jodag 已修复,这是可能用于解决我的问题的代码
  • 第一个函数Month operator++(Month&amp; m) 工作文件位于ideone.com/AoWME2

标签: c++ operator-overloading


【解决方案1】:

在评论中,你说:

有什么我忽略的吗? http://ideone.com/uOkSk0

是的。您正在一个不寻常的地方定义函数——在Date 的定义中。它必须是非成员函数。

使用命名空间标准;

enum Month {
   january = 1,
   february,
   march,
   april,
   may,
   june,
   july,
   august,
   september,
   october,
   november,
   december
};

Month& operator++(Month &m) {
   m = static_cast<Month>(m + 1);
   return m;
}

class Date {
   int y, d;
   Month m;

   public:
   Date(int yy, Month mm, int dd) // constructor
      : y(yy), d(dd), m(mm) { // member initializer
      }


   void add_month() {
      ++m;
   }
};

int main()
{
   Month m = january;
   ++m;

【讨论】:

  • @lakeweb,一旦 OP 在 ideone.com 上发布了 MCVE,就很容易看到错误。我们永远不会过分强调 MCVE 的重要性。
猜你喜欢
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2013-07-13
相关资源
最近更新 更多