Image

Imagesnapdragon2003 wrote in Imagecpp

I'm writing a class for rational numbers, and am doing a lot of operator overloading. I'm getting an error on my overloaded "<<":

u:\Program4\Program4.cpp(16): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'Rational' (or there is no acceptable conversion)
I've searched Google, but haven't been able to find anything that helps yet. Anyone have any suggestions?

Thanks in advance! :-)

///////////////////////////////////
// Rational.h
///////////////////////////////////

#ifndef RATIONAL_CPP
#define RATIONAL_CPP

class Rational
{
   // Binary operators

   friend Rational operator+ (const Rational &r, const Rational &r2)
   {
      Rational rNum( ((r2.numerator * r.denominator) + (r2.denominator * r.numerator)), (r2.denominator * r.denominator) );
      return rNum;
   }

   friend Rational operator- (const Rational &r, const Rational &r2)
   {
      Rational rNum( ((r2.numerator * r.denominator) - (r2.denominator * r.numerator)), (r2.denominator * r.denominator) );
      return rNum;
   }

   friend Rational operator* (const Rational &r, const Rational &r2)
   {
      Rational rNum((r2.numerator * r.numerator), (r2.denominator * r.denominator));
      return rNum;
   }

   friend Rational operator/ (const Rational &r, const Rational &r2)
   {
      // (a d) / (b c)
      Rational rNum((r2.numerator * r.denominator), (r2.denominator * r.numerator));
      return rNum;
   }

   // Unary operator
   friend Rational operator- (const Rational &r)
   {
      Rational r2((r.numerator * (-1)), r.denominator);
      return r2;
   }

   // Comparison operators
   friend bool operator< (const Rational &r, const Rational &r2)
   {
      return ( (r2.numerator * r.denominator) < (r2.denominator * r.numerator) );
   }

   friend bool operator<= (const Rational &r, const Rational &r2)
   {
      return ( (r2.numerator * r.denominator) <= (r2.denominator * r.numerator) );
   }

   friend bool operator> (const Rational &r, const Rational &r2)
   {
      return ( (r2.numerator * r.denominator) > (r2.denominator * r.numerator));
   }

   friend bool operator>= (const Rational &r, const Rational &r2)
   {
      return ( (r2.numerator * r.denominator) >= (r2.denominator * r.numerator) );
   }

   friend bool operator== (const Rational &r, const Rational &r2)
   {
      if((r2.numerator == r.numerator) && (r2.denominator == r.denominator))
         return true;
      else
         return false;
   }

   friend bool operator!= (const Rational &r, const Rational &r2)
   {
      if((r2.numerator != r.numerator) && (r2.denominator != r.denominator))
         return true;
      else
         return false;
   }

   friend Rational abs(const Rational &r)
   {
      Rational rNew(r);

      if(r.numerator < 0)
         rNew.numerator *= (-1);

      if(r.denominator < 0)
         rNew.denominator *= (-1);

      return rNew;
   }

   private:
      int numerator;
      int denominator;
   public:
      Rational(const int num = 0, const int denom = 1);  // default (initial value zero, 0 / 1)
      Rational();
      Rational(const Rational&);             // copy constructor
      int num() const;                       // retrieve numerator
      int denom()const;                      // retrieve denominator
      // Output operator
      ostream& operator<< (ostream&);

      // Assignment operators
      Rational operator= (const Rational &r);
      Rational operator+= (const Rational &r);
      Rational operator-= (const Rational &r);
      Rational operator*= (const Rational &r);
      Rational operator/= (const Rational &r);
};

#endif



///////////////////////////////////
// Rational.cpp
///////////////////////////////////

#include 
using namespace std;

#include "Rational.h"

// Main constructor
Rational::Rational(const int num, const int denom)
{
   numerator = num;
   denominator = denom;
}

Rational::Rational()
{
   numerator = 0;
   denominator = 1;
}
// Copy constructor
Rational::Rational(const Rational &r)
{
   numerator = r.num();
   denominator = r.denom();
}

int Rational::num() const
{
   return numerator;
}

int Rational::denom() const
{
   return denominator;
}

// Binary operators

ostream& Rational::operator<< (ostream& output)
{
   output << numerator << "/" << denominator;
   return output;
}

// Assignment operators

Rational Rational::operator= (const Rational& r)
{
   Rational rNum(r.numerator, r.denominator);
   return rNum;
}

Rational Rational::operator+= (const Rational& r)
{
   Rational rNum = *this + r;
   return rNum;
}

Rational Rational::operator-= (const Rational& r)
{
   Rational rNum = *this - r;
   return rNum;
}

Rational Rational::operator*= (const Rational& r)
{
   Rational rNum((numerator *= r.numerator), (denominator *= r.denominator));
   return rNum;
}

Rational Rational::operator/= (const Rational& r)
{
   Rational rNum((numerator /= r.denominator), (denominator /= r.numerator));
   return rNum;
}


///////////////////////////////////
// Program4.cpp
///////////////////////////////////

#include 
using namespace std;

#include "Rational.h"

int main()
{
   Rational r1();       // initialize to 0
   Rational r2(5);      // initialize to 5
   Rational r3(1, 3);   // initialize to 1/3
   Rational r4(1, 2);   // initialize to 1/2
   Rational r5(2, 5);   // initialize to 2/5

   cout << "r1 == " << r1;
   cout << "r2 == " << r2;  // Line with error

   char chExit;
   cin >> chExit;

   return 0;
}