errore: overloading ‘operator <<' deve essere un operatore binario (ha 3 parametri)

So che ci sono un sacco di domande come queste, ma non sono riuscito a trovare una soluzione che funzionasse per me.

Sto cercando di fare un semplice calcolatore di frazioni che può aggiungere o sottrarre qualsiasi numero di funzioni e scrivere la risposta come una frazione ridotta.

Esempio: input = 3/2 + 4/8, output = 2

Sto provando gli operatori di sovraccarico per realizzare questo.

Quindi, nel programma, sto cercando di sviluppare l’input costituito da un’espressione fatta di frazioni separate dagli operatori ‘+’ o ‘-‘.

Il numero di frazioni nell’espressione è arbitrario.

Ciascuna delle seguenti sei righe è un esempio di espressione di input valida:

1/2 + 3/4 1/2 -5/7+3/5 355/113 3 /9-21/ -7 4/7-5/-8 -2/-3+7/5 

* Il problema che sto avendo è che quando eseguo il mio programma ha un errore di funzionamento in sovraccarico: errore: sovraccarico ‘operatore <<' deve essere un operatore binario (ha 3 parametri) *

  /Users/Spicycurryman/Desktop/ECS40/hw1/fraction.cpp:61:22: error: overloaded 'operator<<' must be a binary operator (has 3 parameters) ostream& Fraction::operator<>' must be a binary operator (has 3 parameters) istream& Fraction::operator>>(istream &os, Fraction& n) 

Non capisco perché questo è un errore.

Il mio codice seguente è qui sotto:

FILE CPP

 #include "Fraction.h" Fraction::Fraction(int a, int b) { } int Fraction::find_gcd (int n1, int n2) { int gcd, remainder; remainder = n1 % n2; while ( remainder != 0 ) { n1 = n2; n2 = remainder; remainder = n1 % n2; } gcd = n2; return (gcd); } void Fraction::reduce_fraction(int nump, int denomp) { this->nump = nump; this->denomp = denomp; int gcd; gcd = find_gcd(nump, denomp); nump = nump / gcd; denomp = denomp / gcd; if ((denomp<0 && nump < 0 )) { denomp*=-1; nump*=-1; } else if (denomp 0){ denomp*=-1; } if ( denomp ==0) { throw invalid_argument( "Error: zero denominator" ); } } Fraction& Fraction::operator+(const Fraction& n) { denom = denomp * n.denom; numera = (nump * n.numera) + (n.denom * n.nump); return (*this); } Fraction& Fraction::operator-(const Fraction& n) { denom = denomp * n.denom; numera = (nump * n.numera) - (n.denom* n.nump); return (*this); } ostream& Fraction::operator<<(ostream &os, Fraction& n) { if (n.numera == 0) { cout << 0 << endl; return os; } else if (n.numera == n.denom) { cout << 1 << endl; return os; } else { cout << n.numera << '/' << n.denom <>(istream &os, Fraction& n) { char slash = 0; return os >> n.numera >> slash >> n.denom; } 

File di intestazione

 #ifndef FRACTION_H #define FRACTION_H #include  #include  using namespace std; class Fraction{ public: Fraction(int a, int b); int fraction(int a,int b); int find_gcd(int n1, int n2); void reduce_fraction(int nump, int denomp); Fraction& operator+(const Fraction& n); Fraction& operator-(const Fraction& n); friend ostream& operator<>(istream &is, const Fraction& n); private: int denom; int numera; int denomp; int nump; }; #endif 

FILE CPP PRINCIPALE

 #include "Fraction.h" #include  using namespace std; int main() { Fraction x(2,3); Fraction y(6,-2); cout << x << endl; cout << y <> y; cout << y << endl; Fraction z = x + y; cout << x << " + " << y << " = " << z << endl; } 

So che gli operatori sono funzioni membro e una funzione membro prende un primo parametro implicito, il che significa che ora i miei operatori accettano tre parametri che possono essere corretti essendo una funzione non membro; tuttavia, ciò non funzionerebbe in questo programma. Come esattamente nel mio caso dovrei risolvere il problema in modo che il programma funzioni?

Grazie mille!

Il problema è che hai dichiarato operator>> e operator<< come funzioni non membro, ma definite come funzione membro.

Questo dovrebbe risolvere il problema (ma aprire un'altra serie di problemi). Quindi invece di

  ostream& Fraction::operator<<(ostream &os, Fraction& n) { ... istream& Fraction::operator>>(istream &os, Fraction& n) { ... 

implementare come:

  ostream& operator<<(ostream &os, Fraction& n) { ... istream& operator>>(istream &os, Fraction& n) { ... 

Inoltre, prendi nota che hai dichiarato funzioni come:

 friend ostream& operator<<(ostream &os, const Fraction& n); friend istream& operator>>(istream &is, const Fraction& n); 

ma definito come (quindi hai cambiato la firma):

  ostream& Fraction::operator<<(ostream &os, Fraction& n) istream& Fraction::operator>>(istream &os, Fraction& n) 

Modo corretto è quello di dichiarare e definire come:

  ostream& Fraction::operator<<(ostream &os, const Fraction& n) istream& Fraction::operator>>(istream &os, Fraction& n) 

Sto aggiungendo solo modifiche. Il resto è lo stesso della domanda:

 class Fraction{ friend ostream& operator<<(ostream &os, const Fraction& n); friend istream& operator>>(istream &is, Fraction& n); // the rest is the same }; ostream& operator<<(ostream &os, const Fraction& n) { if (n.numera == 0) { cout << 0 << endl; return os; } else if (n.numera == n.denom) { cout << 1 << endl; return os; } else { cout << n.numera << '/' << n.denom << endl; return os; } } istream& operator>>(istream &os, Fraction& n) { char slash = 0; return os >> n.numera >> slash >> n.denom; }