重载运算符<<无法绑定basic_ostream<char>值

Overloading operator<< Cannot bind basic_ostream<char> lvalue

本文关键字:lt ostream char gt 运算符 重载 绑定 basic      更新时间:2023-10-16

为什么这不起作用:

ostream& operator<<(ostream& os, const Date& d)
{
    return os << '(' << d.year() << ',' << d.month();
}

虽然这有效:

ostream& operator<<(ostream& os, const Date& d)
{
    return os << '(' << d.year() << ',';
}

编辑错误:

error: cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&'|
error:   initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = Chrono::Month]'|

发现了一些关于这个问题的问题,但他们的问题太高级了,我无法理解。

编辑 2

month()函数:

Month month() const {return m;}

Month enum class

enum class Month
{
    jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov ,dec
};

问题在于你调用operator<<的地方,而不是它的定义。

您可能在这样的上下文中调用它:

std::ofstream() << "Hello World";

即您正在写入临时ostream.这与operator<<的定义相反,在定义中,您声明您正在使用">永久"(即不是临时(的ostream。

编辑

在进一步检查错误消息后,问题在于缺少类型 enum class Monthoperator<<定义。添加这样的定义,即 std::ostream& operator<<(std::ostream& os, Month m),解决了问题。

我的工作正常

#include <iostream>
class Date
{
private:
    int d, m, y;
public:
    Date(int _d, int _m, int _y) : d(_d), m(_m), y(_y) {}
    int day() const { return d; }
    int month() const { return m; }
    int year() const { return y; }
    friend std::ostream &operator<<(std::ostream &out, Date &d);
};
std::ostream &operator<<(std::ostream &out, Date &d)
{
    return out << '(' << d.year() << ',' << d.month();
}
int main()
{
    std::cout << Date(1, 2, 3) << std::endl;
    return 0;
}