即使我重载了`operator<<`,也不能在类中使用`cout`

Posted

技术标签:

【中文标题】即使我重载了`operator<<`,也不能在类中使用`cout`【英文标题】:Can't use `cout` with a class even if I overloaded `operator<<` 【发布时间】: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。 这段代码完全没有意义。 【参考方案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 的原始类型。 我又修好了。他们现在都是双倍的。

以上是关于即使我重载了`operator<<`,也不能在类中使用`cout`的主要内容,如果未能解决你的问题,请参考以下文章

为啥在c++中实现基于类的优先级队列时需要重载operator<?

错误:“int”和“<未解析的重载函数类型>”类型的无效操作数到二进制“operator/”

将对象传递给重载运算符

为什么operator<<;;运算符重载一定要为友元函数呢?

重载operator new delete函数

使用operator ==进行结构重载