Using Overloaded stream extraction operator Compiler Error: no match for 'operator>>' in 'std::cin >> c'

Hello, I am relatively new to programming and cannot figure out what the problem is.


I get a compiler error no match for 'operator>>' in 'std::cin >> c'. I wrote the code in one long file and it worked fine. When I tried to separate interface from implementation I received this error. The teacher supplied the driver program so please don't suggest that I modify that.



Any help with this would be greatly appreciated. I am using DEV-C++ 4.9.9.2 just in case it makes any difference. Thank you for (in advance) for any assistance.


//RationalNumber.h

#ifndef RATIONALNUMBER_H
#define RATIONALNUMBER_H

#include <iostream>
#include <iomanip>



using namespace std;

class RationalNumber

{
public:
RationalNumber(int numerator, int denominator);
RationalNumber(); //sets numerator to 0,denominator to 1
friend RationalNumber operator+(const RationalNumber&,const RationalNumber&);
friend RationalNumber operator-(const RationalNumber&,const RationalNumber&);
friend RationalNumber operator*(const RationalNumber&,const RationalNumber&);
friend RationalNumber operator/(const RationalNumber&,const RationalNumber&);
friend bool operator<(const RationalNumber&,const RationalNumber&);
friend bool operator<=(const RationalNumber&,const RationalNumber&);
friend bool operator>(const RationalNumber&,const RationalNumber&);
friend bool operator >=(const RationalNumber&,const RationalNumber&);
friend bool operator ==(const RationalNumber&,const RationalNumber&);
friend bool operator !=(const RationalNumber&,const RationalNumber&);

friend ostream& operator <<(ostream&,const RationalNumber&);
friend istream& operator >>(istream&,RationalNumber&);

//private:
int n;
int d;

};

#endif





//RationalNumber.cpp

#include <cstdlib>
#include <iostream>
#include "RationalNumber.h"



void normalize(int &n, int &d);

RationalNumber::RationalNumber(int numer, int denom)
{
normalize(numer, denom);
n = numer;
d = denom;
}




RationalNumber::RationalNumber():n(), d(){}

RationalNumber operator +(const RationalNumber& left, const RationalNumber& right)
{
int numer = left.n * right.d + left.d * right.n;
int denom = left.d * right.d;
normalize(numer, denom);
RationalNumber local(numer, denom);
return local;
}

RationalNumber operator -(const RationalNumber& left, const RationalNumber& right)
{
int numer = left.n * right.d - left.d * right.n;
int denom = left.d * right.d;
normalize(numer, denom);
RationalNumber local (numer, denom);
return local;
}

RationalNumber operator *(const RationalNumber& left,const RationalNumber& right)
{
RationalNumber product;
int numer = left.n * right.n;
int denom = left.d * right.d;
normalize(numer, denom);
product = RationalNumber(numer, denom);
return product;
}

RationalNumber operator/(const RationalNumber& left,const RationalNumber& right)
{
RationalNumber quotient;
int numer = left.n * right.d;
int denom = left.d * right.n;
normalize(numer, denom);
quotient = RationalNumber(numer, denom);
return quotient;
}


istream& operator >>(istream& in, RationalNumber& right)
{
char ch;
in >> right.n >> ch >> right.d;
normalize(right.n, right.d);
}

ostream& operator <<(ostream& out,const RationalNumber& right)
{ out << right.n << '/' << right.d;}

bool operator <(const RationalNumber& left,const RationalNumber& right)
{ return left.n * right.d < right.n * left.d;}

bool operator <=(const RationalNumber& left, const RationalNumber& right)
{ return left.n * right.d <= right.n * left.d;}

bool operator >(const RationalNumber& left, const RationalNumber& right)
{ return left.n * right.d > right.n * left.d;}

bool operator >=(const RationalNumber& left, const RationalNumber& right)
{ return left.n * right.d >= right.n * left.d;}

bool operator==(const RationalNumber& left, const RationalNumber& right)
{ return left.n * right.d == right.n * left.d;}

bool operator!=(const RationalNumber& left, const RationalNumber& right)
{ return left.n * right.d != right.n * left.d;}



void normalize(int& n, int& d)
{
if (d == 0){cout << "Invalid Denominator:0" <<endl; d = 1;}

int largest;
largest = n > d ? n : d;

int gcd = 0; // greatest common divisor

for ( int loop = 2; loop <= largest; loop++ )

if ( n % loop == 0 && d % loop == 0 )
gcd = loop;

if (gcd != 0)
{
n /= gcd;
d /= gcd;

}

}




#include <iostream>

#include "RationalNumber.h"
using namespace std;



int main()
{
// RationalNumber c( 1, 3 ), d( 2, 4 ), x;
RationalNumber c, d, x;

// test overloaded stream extraction operator
cout << "Enter a Rational Number (n/d): ";
cin >> c;
cout << "Enter a Rational Number (n/d): ";
cin >> d;

x = c + d; // test overloaded operators + and =
cout << c << " + " << d << " = " << x << endl;

x = c - d; // test overloaded operators - and =
cout << c << " - " << d << " = " << x << endl;

x = c * d; // test overloaded operators * and =
cout << c << " * " << d << " = " << x << endl;

x = c / d; // test overloaded operators / and =
cout << c << " / " << d << " = " << x << endl;

// test overloaded > operator
cout << c << ( ( c > d ) ? " > " : " <= " ) << d
<< " according to the overloaded > operator\n";

// test overloaded >= operator
cout << c << ( ( c >= d ) ? " >= " : " < " ) << d
<< " according to the overloaded >= operator\n";

// test overloaded < operator
cout << c << ( ( c < d ) ? " < " : " >= " ) << d
<< " according to the overloaded < operator\n";

// test overloaded <= operator
cout << c << ( ( c <= d ) ? " <= " : " > " ) << d
<< " according to the overloaded <= operator\n";

// test overloaded == operator
cout << c << ( ( c == d ) ? " == " : " != " ) << d
<< " according to the overloaded == operator\n";

// test overloaded != operator
cout << c << ( ( c != d ) ? " != " : " == " ) << d
<< " according to the overloaded != operator\n";

system ("pause");
return 0;
} // end main
Other than the missing return statements in operator<< and operator>>, this program has no major errors: it compiles (after fixing that) and runs (tested with four different compilers)
Perhaps you didn't add your second cpp file to the project?
Awesome I got it fixed. Thank you for your advice.
Topic archived. No new replies allowed.