C++重载<<运算符配合自增运算符使用出现编译错误问题求助
问题根源
核心错误来自编译日志给出的类型不匹配:非const左值引用无法绑定到右值。
- 你实现的前后置
++运算符返回的都是值类型的Date对象,++d1和d1++的返回结果都是临时对象,属于C++中的右值范畴。 - 你重载的
<<运算符第二个参数为Date& d,属于非const左值引用,C++语法禁止这种引用绑定到右值上,因此找不到匹配的运算符实现。 - 之前
(++d1).display()可以正常运行,是因为display是const成员函数,允许被临时右值对象调用,不存在引用绑定问题。
修复方案
1. 修正<<运算符参数(必改)
输出操作不需要修改Date对象,将第二个参数改为const左值引用即可兼容左值对象和右值临时对象:
首先修改类内的友元声明:
friend ostream &operator << (ostream &out, const Date &d);
再修改运算符实现:
ostream &operator << (ostream &out, const Date &d) { out << d.day <<"-"<< d.month <<"-"<< d.year; return out; }
修改后即可同时支持cout << d1、cout << ++d1、cout << d1++三种写法。
2. 修正前置++返回值(可选,符合规范)
C原生前置运算符返回的是操作对象的左值引用,你当前的实现返回值类型会产生额外拷贝,也不符合常规语义,建议修改:
首先修改类内的运算符声明:
Date& operator ++ ();
再修改实现的返回类型:
Date& Date:: operator ++ () { // 原有逻辑完全不变 day += 1; if (month == 2) { if (!isLeapYear(year) && day > 28) { month += 1; day = 1; } else if (isLeapYear(year) && day > 29) { month += 1; day = 1; } } else if (day > 30 and inArray(month, month30, size30)) { month += 1; day = 1; } else if (day > 31 and inArray(month, month31, size31)) { month += 1; day = 1; } if (month > 12) { year += 1; month = 1; } return *this; }
内容的提问来源于stack exchange,提问作者Ankan
相关产品推荐
相关产品推荐

