2017-02-24 6 views
-2

Titel sagt alles. Ich überlastete den Operator < <, wie jeder im Internet sagte, aber ich habe immer noch diesen dummen Fehler für einen ungültigen Betreiber. Was habe ich falsch gemacht? Hier ist mein Code:Kann `cout` nicht mit einer Klasse verwenden, selbst wenn ich` operator << überladen habe

#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

Was ist der genaue Fehler, den Sie bekommen? – NathanOliver

+1

Was ist der Rückgabetyp der Summenelementfunktion ...? ;) –

+0

... \ main.cpp | 42 | Fehler: keine Übereinstimmung für 'Operator <<' (Operandentypen sind 'std :: ostream {aka std :: basic_ostream }' und 'void') | –

Antwort

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

Der Rückgabetyp von Ihrer Sum() Methode ist ein void. Offensichtlich funktioniert operator<< nicht auf void s.

Sie müssen Ihre Sum(), usw. ändern, um Calc & zurückzugeben, und lassen Sie sie *this zurückgeben.

1

Ihr Code kompiliert nicht auch ohne die <<:

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

Ihre Funktionen deklariert werden void zurückzukehren.

+0

Sie alle zu int zu ändern hat es getan. Danke, Mann! –

+0

@ UlisseBenedettiUlisse54: warum Return Int, wenn Ihre Parameter lang doppelt sind? – stefaanv

+0

BTW, Ihre überladene Funktion wird aufgerufen, wenn Sie 'Calc c; c.i = 5; std :: cout << c; ', nicht wenn Sie' Calc c; std :: cout << c.Sum (1.0, 2.0); 'wenn es einen primitiven Typ wie int zurückgibt. – stefaanv

Verwandte Themen