【问题标题】:Overloading << with ostream and an enum type使用 ostream 和枚举类型重载 <<
【发布时间】:2017-12-13 13:45:22
【问题描述】:

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

#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

我该如何解决这个问题?

【问题讨论】:

  • 使用 enum class days 代替 enum days :使用 enum class 禁止隐式转换为整数类型。这样你会得到一个错误,而不是编译器绕过你的重载运算符,因为它与临时对象不匹配(你需要将days const&amp; 作为参数而不是days&amp;:后者只绑定到 [可修改] 左值。

标签: c++ oop enums operator-overloading


【解决方案1】:

请注意,operator&lt;&lt; 通过引用非常量来获取参数daydayaftertomorrow 按值返回; dayaftertomorrow 返回的是一个临时的,不能绑定到非常量的引用。那么对于cout &lt;&lt; dayaftertomorrow(d),您的operator&lt;&lt; 将不会被调用,枚举器将从implicitly convertedint,然后通过std::basic_ostream::operator<< 打印出来;这就是你得到3的原因。

要解决此问题,您可以将参数类型更改为引用const;这可以绑定到临时。或将其更改为按值传递。例如

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

ostream& operator<< (ostream& out, days day)

LIVE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多