Ошибка оператора дробного сравнения в C ++ - PullRequest
0 голосов
/ 16 октября 2018

Итак, я новичок в c ++ и пытаюсь создать класс дроби C ++ с перегрузкой операций.Все было хорошо, пока я не получил ошибку в строке сравнения меньше основной функции:

    Fraction someNum(15, 9);

    ......

    if (someNum > 1)
        cout << "15/9 > 1." << endl;

    if (1 < someNum) //throws error
        cout << "1 < someNum." << endl;

Ошибка:

    operator<(const error_condition& __lhs,
            ^~~~~~~~
    c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\system_error:274:3: note:   no known conversion for argument 1 from 'int' to 'const std::error_condition&'

Странно то, что сравнение больше, чем сравнениепечатает вывод правильно и не выдает ошибку, несмотря на то, что они оба являются смешанными сравнениями.

Вот соответствующий код в моем другом файле .cpp:

    //lesser than
    bool Fraction::operator<(Fraction right) {
    return (num * (denom * right.denominator())) < (right.numerator() * (denom * right.denominator()));}
    //greater than
    bool Fraction::operator>(Fraction right) {
    return (num * (denom * right.denominator())) > (right.numerator() * (denom * right.denominator()));}

Как вы можете видеть,строки кода точно такие же, за исключением оператора сравнения.Однако один выдает ошибку, а другой - нет.Как только вы уберете последний результат сравнения, все будет работать правильно.Я вообще не понимаю, как это исправить ...

Любые указатели будут с благодарностью.Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Спасибо!

1 Ответ

0 голосов
/ 16 октября 2018

Вам понадобится operator<, который соответствует порядку аргументов, как представлено.Сравнение op> в вашем работающем примере имеет параметры в обратном порядке, поэтому оно будет соответствовать перегрузке op>, аналогичной порядку параметров перегрузки op<, который вы показали в своем коде.

https://godbolt.org/z/bMMMX9

struct Foo {};

bool operator>(Foo, int);

struct Bar {};

bool operator>(Bar, int);
bool operator>(int, Bar); // This one has the parameters in both orders

int main() {
    Foo f;
    f > 1;
    1 > f; // doesn't work

    Bar b;
    b > 1;
    1 > b; // works
}

Вы также можете поместить компаратор внутри структуры следующим образом:

struct Bar {
    friend bool operator>(Bar, int);
    friend bool operator>(int, Bar);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...