重载运算符&lt;&lt;无法绑定basic_ostream <char>左值

时间:2015-07-27 10:42:10

标签: c++

为什么这不起作用:

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
};

2 个答案:

答案 0 :(得分:2)

问题在于您调用operator<<,而不是在其定义中。

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

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

即。您正在写入临时 ostream。这与operator<<的定义形成对比,在operator<<中,您声明您正在使用“永久”(即不是临时的)ostream。

修改

在进一步检查错误消息后,问题出现在enum class Month类型的std::ostream& operator<<(std::ostream& os, Month m)缺少定义。添加这样的定义,即 object GzipJson extends (Response => JValue) { def apply(r: Response) = { if(r.getHeader("content-encoding")!=null && r.getHeader("content-encoding").equals("gzip")){ (parse(new GZIPInputStream(r.getResponseBodyAsStream), true)) }else (dispatch.as.String andThen (s => parse(StringInput(s), true)))(r) } } ,解决了这个问题。

答案 1 :(得分:0)

我的工作正常

#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;
}