Помогите найти ошибку в операторе ввода

Вкратце дали задание написать клас, чтобы работала main и проходила все юнит-тесты, но никак не могу разобраться как мне реализовать оператор ввода. Подскажите кто знает.

Выдает ошибку

отсутствует оператор ввода >> соответствующий этим операндам

.

istream& operator>>(istream& ist, Rational& r) {
    return ist >> r.Numerator() >> r.Denominator();
}

В main всё вот так:

istringstream input("5/7");
        Rational r;
        input >> r;
        bool equal = r == Rational(5, 7);
        if (!equal) {
            cout << "5/7 is incorrectly read as " << r << endl;
            return 2;
        }

Как вы могли понять нужно осуществить оператор ввода дробей.

Сам код:

#include <iostream>
#include <sstream>

using namespace std;

class Rational {
public:
    Rational() {
        p = 0;
        q = 1;
    };
    Rational(int numerator, int denominator) {
        if (numerator < 0 && denominator > 0) {
            numerator = numerator * -1;
            p = numerator / NOD(numerator, denominator);
            q = denominator / NOD(numerator, denominator);
            p *= -1;
        }
        else if (numerator > 0 && denominator < 0) {
            denominator = denominator * -1;
            p = numerator / NOD(numerator, denominator);
            q = denominator / NOD(numerator, denominator);;
            p *= -1;
        }
        else {
            p = numerator / NOD(numerator, denominator);
            q = denominator / NOD(numerator, denominator);
        }
    };
    int Numerator() const {
        return p;
    };
    int Denominator() const {
        return q;
    };
    friend istream& operator>>(istream& ist, Rational& r);
private:
    int NOD(int numerator, int denominator) {
        while (numerator && denominator)if (numerator < denominator) denominator %= numerator; else numerator %= denominator;
        return numerator + denominator;
    };
    int p;
    int q;
};
int NOD(int numerator, int denominator) {
    while (numerator && denominator)if (numerator < denominator) denominator %= numerator; else numerator %= denominator;
    return numerator + denominator;
};
int NOK(int denominator_1, int denominator_2) {
    if (denominator_1 < 0) denominator_1 *= -1;
    if (denominator_2 < 0) denominator_2 *= -1;
    return (denominator_1 / NOD(denominator_1, denominator_2)) * denominator_2;
}

bool& operator==(const Rational& r1, const Rational& r2) {
    bool bl;
    if (r1.Numerator() == r2.Numerator() && r1.Denominator() == r2.Denominator()) {
        bl = true;
    }
    else {
        bl = false;
    }
    return bl;
}
Rational& operator+(Rational& r1, Rational& r2) {
    int pp, qq;
    pp = (NOK(r1.Denominator(), r2.Denominator()) / r1.Denominator()) * r1.Numerator() + (NOK(r1.Denominator(), r2.Denominator()) / r2.Denominator()) * r2.Numerator();
    qq = NOK(r1.Denominator(), r2.Denominator());
    Rational r3(pp, qq);
    return r3;
}
Rational& operator-(Rational& r1, Rational& r2) {
    int pp, qq;
    pp = (NOK(r1.Denominator(), r2.Denominator()) / r1.Denominator()) * r1.Numerator() - (NOK(r1.Denominator(), r2.Denominator()) / r2.Denominator()) * r2.Numerator();
    qq = NOK(r1.Denominator(), r2.Denominator());
    Rational r3(pp, qq);
    return r3;
}
Rational& operator*(Rational& r1, Rational& r2) {
    int pp, qq;
    pp = r1.Numerator() * r2.Numerator();
    qq = r1.Denominator() * r2.Denominator();
    Rational r3(pp, qq);
    return r3;
}
Rational& operator/(Rational& r1, Rational& r2) {
    int pp, qq;
    pp = r1.Numerator() * r2.Denominator();
    qq = r1.Denominator() * r2.Numerator();
    Rational r3(pp, qq);
    return r3;
}
istream& operator>>(istream& ist, Rational& r) {
    return ist >> r.Numerator() >> r.Denominator();
}
ostream& operator<<(ostream& ost, const Rational& r) {
    ost << r.Numerator() << "/" << r.Denominator();
    return ost;
}
int main() {
    {
        ostringstream output;
        output << Rational(-6, 8);
        if (output.str() != "-3/4") {
            cout << "Rational(-6, 8) should be written as \"-3/4\"" << endl;
            return 1;
        }
    }
    {
        istringstream input("5/7");
        Rational r;
        input >> r;
        bool equal = r == Rational(5, 7);
        if (!equal) {
            cout << "5/7 is incorrectly read as " << r << endl;
            return 2;
        }
    }
    {
        istringstream input("");
        Rational r;
        bool correct = !(input >> r);
        if (!correct) {
            cout << "Read from empty stream works incorrectly" << endl;
            return 3;
        }
    }
    {
        istringstream input("5/7 10/8");
        Rational r1, r2;
        input >> r1 >> r2;
        bool correct = r1 == Rational(5, 7) && r2 == Rational(5, 4);
        if (!correct) {
            cout << "Multiple values are read incorrectly: " << r1 << " " << r2 << endl;
            return 4;
        }
        input >> r1;
        input >> r2;
        correct = r1 == Rational(5, 7) && r2 == Rational(5, 4);
        if (!correct) {
            cout << "Read from empty stream shouldn't change arguments: " << r1 << " "
                << r2 << endl;
            return 5;
        }
    }
    {
        istringstream input1("1*2"), input2("1/"), input3("/4");
        Rational r1, r2, r3;
        input1 >> r1;
        input2 >> r2;
        input3 >> r3;
        bool correct = r1 == Rational() && r2 == Rational() && r3 == Rational();
        if (!correct) {
            cout << "Reading of incorrectly formatted rationals shouldn't change arguments: "
                << r1 << " " << r2 << " " << r3 << endl;
            return 6;
        }
    }
    cout << "OK" << endl;
    return 0;
}

Ответы (1 шт):

Автор решения: Harry

Для такого использования вот это

int Numerator() const {
    return p;
};
int Denominator() const {
    return q;
}

должно иметь вид

int& Numerator() {
    return p;
};
int& Denominator() {
    return q;
}

Но я бы делал иначе.

istream& operator>>(istream& ist, Rational& r) {
    return ist >> r.p >> r.q;
}

Тем более что он у вас объявлен как friend.

→ Ссылка