2017-02-24 15 views
-2

タイトルはすべてです。私はインターネット上の誰もが言ったようにオペレータ< <をオーバーロードしましたが、無効なオペレータについてはまだ愚かなエラーがあります。私は何を間違えたのですか?ここに私のコードは次のとおりです。`operator <<`をオーバーロードしてもクラスで `cout`を使用できません

#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); 
} 
+1

正確なエラーは何ですか? – NathanOliver

+1

sumメンバー関数の戻り値の型は...とは何ですか? ;) –

+0

... \ main.cpp | 42 | error: 'operator <<'に一致しません(オペランドの型は 'std :: ostream {別名std :: basic_ostream }'と 'void')。 –

答えて

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

あなたSum()メソッドからの戻り値の型がvoidです。明らかに、operator<<voidで動作しません。

Sum()などをCalc &に返すように変更し、*thisを返すようにする必要があります。

1

あなたのコードはさえ<<なしでコンパイルされません:

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

あなたの関数はvoidを返すように宣言されています。

+0

それらをすべてintに変更しました。ありがとう! –

+0

@ UlisseBenedettiUlisse54:パラメータがlong doubleの場合、intを返すのはなぜですか? – stefaanv

+0

ところで、 'Calc c;を実行するとあなたのオーバーロードされた関数が呼び出されます。 c.i = 5; std :: cout << c; 'では、' Calc c; std :: cout << c.Sum(1.0、2.0); 'intのようなプリミティブ型を返す場合。 – stefaanv

関連する問題