| joey3638r (2) | |
|
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 | |
|
|
|
| Cubbi (1927) | |
|
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? | |
|
|
|
| joey3638r (2) | |
| Awesome I got it fixed. Thank you for your advice. | |
|
|
|