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

85,328

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;

}
Share:
85,328

Related videos on Youtube

Rohit Tigga
Author by

Rohit Tigga

http://www.rohittigga.com

Updated on July 09, 2022

Comments

  • Rohit Tigga
    Rohit Tigga almost 2 years

    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!

    • Frédéric Hamidi
      Frédéric Hamidi about 10 years
      You could use friend non-member functions.
    • chris
      chris about 10 years
      Friend functions aren't member functions. Member functions would have no need to be friends because they already have private access.
    • clcto
      clcto about 10 years
      In your operator<<( ostream& os, ... ) you should output to os not to cout.
    • Lundin
      Lundin about 10 years
      The problem is only related to the overloading of <<. The rest of the post is irrelevant. Please try to minimize the question to only include the part you are having trouble with.
    • Lundin
      Lundin about 10 years
    • anonymous
      anonymous about 10 years
      operator+ is a problem too. It should return new Fraction. Otherwise, x+y will cause one of the operands to change in value.
  • Rohit Tigga
    Rohit Tigga about 10 years
    When I ran the program fully with the makefile because they are different
  • Ross
    Ross about 6 years
    This depends on where you defined the operator>>, if you implement the operator in the header, it must be declared inline. In Fraction.h inline istream& operator>>(istream &os, Fraction& n) If you declare the function in Fraction.h but implement it in Fraction.cpp, you do not need to make it an inline function. This may depend on the compiler.
  • heretoinfinity
    heretoinfinity about 4 years
    @BЈовић, what is the other set of problems you refer to?