使用 ostream 和枚举类型重载<<

Overloading << with ostream and an enum type

本文关键字:lt 重载 类型 ostream 枚举 使用      更新时间:2023-10-16

以下是我的代码。我正在尝试打印一个枚举的数据类型变量,一个直接的名称,另一个具有与原始变量相同的数据类型的函数。

#include <iostream>
using namespace std;
enum days{SUN, MON, TUE, WED, THU, FRI, SAT};

inline days dayaftertomorrow(days d)
{
  return static_cast<days>((static_cast<int>(d) + 2) % 7);
}
ostream& operator<< (ostream& out, days& day)
{
  switch(day)
  {
    case SUN: out << "SUN"; break;
    case MON: out << "MON"; break;
    case TUE: out << "TUE"; break;
    case WED: out << "WED"; break;
    case THU: out << "THU"; break;
    case FRI: out << "FRI"; break;
    case SAT: out << "SAT"; break;
  }
  return out;
}

int main(int argc, char const *argv[]) {
  days d = MON, e;
  e = dayaftertomorrow(d);
  cout << d << "t" << e << endl;
  cout << d << "t" << dayaftertomorrow(d) << endl;
  return 0;
}

我希望结果为

MON     WED
MON     WED

但是我得到了

MON     WED
MON     3

我将如何解决此问题?

请注意,operator<<通过参考非CONST进行参数daydayaftertomorrow按值返回;dayaftertomorrow返回的是一个临时性,不能绑定到非const。然后,对于cout << dayaftertomorrow(d),您的operator<<将不会被调用,枚举器将隐式转换为int,然后通过STD :: BASIC_OSTREAM ::操作员&lt;&lt;&lt;反而;这就是为什么您获得3

要解决问题,您可以将参数类型更改为const;可以与临时性结合。或将其更改为逐个价值。例如

ostream& operator<< (ostream& out, const days& day)
//                                 ~~~~~
ostream& operator<< (ostream& out, days day)

live