【问题标题】:Can't use `cout` with a class even if I overloaded `operator<<`即使我重载了`operator<<`,也不能在类中使用`cout`
【发布时间】:2017-02-24 13:20:02
【问题描述】:

标题说明一切。正如互联网上的每个人所说的那样,我重载了 operator

#include <iostream>
#include <cstdio>

using namespace std;

class Calc {
private:
    union _Print_Datatypes {
        int I;
        double D;
        string S;
        char C;
    };
public:
    int i;
    void Sum(long double _a, long double _b) {
        return _a + _b;

    }
    void Sub(long double _a, long double _b) {
        return _a - _b;

    }
    void Div(long double _a, long double _b) {
        return _a / _b;

    }
    void Mult(long double _a, long double _b) {
        return _a * _b;

    }
};


std::ostream &operator<<(std::ostream &os, Calc const &m) {
    return os << m.i;
}

int main() {

    Calc _calc;
    cout << _calc.Sum(2,2);
}

【问题讨论】:

  • 你得到的确切错误是什么?
  • sum 成员函数的返回类型是什么...? ;)
  • ...\main.cpp|42|error: no match for 'operator}' 和 '无效')|
  • @DanielJour 是返回 _a + _b。
  • 这段代码完全没有意义。

标签: c++ class operator-overloading


【解决方案1】:
cout << _calc.Sum(2,2);

Sum() 方法的返回类型是 void。显然,operator&lt;&lt; 不适用于voids。

您需要将您的Sum() 等人更改为返回Calc &amp;,并让他们返回*this

【讨论】:

    【解决方案2】:

    即使没有&lt;&lt;,您的代码也无法编译:

    main.cpp:17:9: error: void function 'Sum' should not return a value [-Wreturn-type]
            return _a + _b;
            ^      ~~~~~~~
    

    您的函数被声明为返回void

    【讨论】:

    • @UlisseBenedettiUlisse54:如果您的参数是 long double,为什么要返回 int?
    • 顺便说一句,当您执行 Calc c; c.i = 5; std::cout &lt;&lt; c; 时调用您的重载函数,而不是当您执行 Calc c; std::cout &lt;&lt; c.Sum(1.0, 2.0); 时,如果它返回类似 int 的原始类型。
    • 我又修好了。他们现在都是双倍的。
    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 2018-04-06
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多