Перегрузка меньше чем оператор в c ++ для использования в std :: sort - PullRequest
0 голосов
/ 01 мая 2020

У меня есть структура, определенная следующим образом:

struct IFSFunc {
    int a;

    bool operator<(const IFSFunc& other) {
        return a < other.a;
    }
};

Поскольку IFSfunc является struct, модификатор доступа для operator< должен быть public.

I также есть этот код:

#include <algorithm>
std::vector<std::pair<double, IFSFunc>> ifsFuncs;

// fill the vector with various data

std::sort(ifsFuncs.begin(), ifsFuncs.end());

Мне нужно отсортировать ifsFuncs на основе первого double в паре. Меня не волнует структура IFSFunc, если double такой же.

Однако, для работы std :: sort, который определяется так:

template <class _Ty1, class _Ty2>
_NODISCARD constexpr bool operator<(const pair<_Ty1, _Ty2>& _Left, const pair<_Ty1, _Ty2>& _Right) {
    return _Left.first < _Right.first || (!(_Right.first < _Left.first) && _Left.second < _Right.second);
}

Я должен переопределить оператор меньше чем для second в этом случае IFSfunc, что я и сделал. Тем не менее, попытка скомпилировать этот код дает мне следующую ошибку:

Error C2678 binary '<': no operator found which takes a left-hand operand of type 'const _Ty2' (or there is no acceptable conversion)

Почему?

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Вы должны определить этот оператор как функцию-член const.

Кроме того, не просто возвращайте true для сравнения. Это может привести к бесконечному циклу.

0 голосов
/ 01 мая 2020

Я просто понял это. Подпись перегруженной функции была неправильной, вот что мне нужно:

struct IFSFunc {
    int a;

    bool operator<(const IFSFunc& other) const {
        return a < other.a;
    }
};

Обратите внимание, что operator< теперь является константной функцией.

...