Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

error: overloaded 'operator<<' must be a binary operator (has 3 parameters)

I know there are plenty of questions like these, but I couldn't find a solution that worked for me.

I am trying to make simple fraction calculator than can add or subtract any number of functions and write the answer as a reduced fraction.

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

I am trying overload operators in order to accomplish this.

So in the program I am trying to develop, the input consists of an expression made of fractions separated by the operators + or -.

The number of fractions in the expression is arbitrary.

Each of the following 6 lines is an example of a valid input expression:

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

***The problem that I am having is that in when I run my program it has an overload operating error: *error: overloaded 'operator<<' must be a binary operator (has 3 parameters)****

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

I don't understand why that is an error.

My following code is below:

CPP FILE

#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 &&  nump >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 << endl;         return os;     } }    istream& Fraction::operator>>(istream &os, Fraction& n) {     char slash = 0;     return os >> n.numera >> slash >> n.denom;  } 

Header File

#ifndef FRACTION_H #define FRACTION_H #include <iostream> #include <stdexcept> 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<<(ostream &os, const  Fraction& n);     friend istream& operator>>(istream &is, const Fraction& n); private:     int denom;     int numera;     int denomp;     int nump;    };  #endif 

MAIN CPP FILE

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

I know that the operators are member functions and a member function takes an implicit first parameter, meaning my operators now takes three parameters it may be fixed being a non-member function; however, that would not work in this program. How exactly in my case would I fix it so the program would work?

Thank you very much!

like image 417
Rohit Tigga Avatar asked Apr 28 '14 07:04

Rohit Tigga


1 Answers

The problem is that you declared operator>> and operator<< as non-member functions, but defined as a member function.

This should fix that problem (but open another set of problems). So instead of

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

implement as :

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

Also, take a note that you declared functions as :

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

but defined as (therefore you changed the signature) :

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

Proper way is to declare and define as :

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

I am adding just changes. The rest is the same as in the question:

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;  } 
like image 103
BЈовић Avatar answered Oct 15 '22 12:10

BЈовић