Nov 30, 2012 at 10:44pm UTC
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