使用 ostream 和枚举类型重载<<
Overloading << with ostream and an enum type
以下是我的代码。我正在尝试打印一个枚举的数据类型变量,一个直接的名称,另一个具有与原始变量相同的数据类型的函数。
#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进行参数day
。dayaftertomorrow
按值返回;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
相关文章:
- C++重载<<具有typedef'd std::vector
- 重载运算符<<:此运算符函数的参数太多
- 在VS 2012上编译,但不使用Netbeans/MinGW-重载<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- C++分离成员流重载<<
- 我已经完成了<<运算符重载,但它'It’不起作用
- 重载运算符<<输出地址而不是数据成员
- 重载运算符<<用于ostream语法
- 重载operator< & lt;作为会员打印
- Operator< & lt;重载隐藏其他
- 重载& lt; & lt;为什么我得到以下错误
- 重载ostream&时转换错误无效;operator< & lt;
- operator< & lt;在c++中为类中的类重载
- 重载& lt; & lt;用于打印自定义异常的操作符
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多
- 上Ostream & lt; & lt;重载的困惑
- 重载& lt; & lt;为了我的班级
- 使用带有重载<<endl上的运算符
- 重载& lt; & lt;使用命名空间std
- operator< & lt;重载、名称空间和模板