Компаратор для сортировки в классе

119
30 июня 2019, 05:20

Имею такие методы:

const bool Date::compare_dates(const Date &d1, const Date &d2) const {
    return d1 < d2;
}
void Date::sort_dates(Date *dates, const int &num) const {
    std::sort(dates[0], dates[num - 1], compare_dates);
}

В месте вызова compare_dates возникает еррор:

Reference to non-static member function must be called

Как это понимать?

Answer 1

Сделайте метод сравнения статическим (в заголовочном файле):

class Date
{
//...
    static bool compare_dates(const Date &d1, const Date &d2) const;
//...
};

Вызов:

void Date::sort_dates(Date *dates, const int &num) const
{
    std::sort(dates[0], dates[num - 1], Date::compare_dates);
}
Answer 2

Это означает, что просто compare_dates является некорректным синтаксисом в С++. Имя метода класса может использоваться только в ограниченном наборе синтаксических контекстов, вроде вызова метода класса, взятия адреса метода класса и т.п. У вас же просто ни с того ни с сего в списке аргументов болтается одинокое compare_dates. Что это?

Отдельно непонятно, почему вы пытаетесь передавать dates[0] и dates[num - 1] в списке аргументов. Если ваша задача - отсортировать массив dates, то можно предположить, что передавать надо dates и dates + num... И почему у вас вдруг стало num - 1? И зачем вы сделали передачу num по ссылке?

Ну и самое главное, почему-то до сих пор не упомянутое в ответах: если у вас уже определен оператор сравнения < для класса Date, то зачем вам вообще понадобился этот метод compare_dates? Никакой необходимости в этом compare_dates нет. Просто пишите

std::sort(dates, dates + num);
Answer 3

ошибки:

  1. Ваш компаратор метод класса и должен вызываться обьектом, поэтому он не может иметь два аргумента. Если вы не хотите сделать его статической функцией (не связанный с обьектом), то она должна получать один аргумент, поскольку первым аргументом будет *this, т.е. обьект, для которого вызывается метод.
  2. Дальше вы в стандартном альгоритме хотите вызвать функцию без обьекта. Чтобы исправить эту ошибку, нужно передать указатель на метод, функтору, который для каждого обьекта вызовит метод.

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

Выходит вам нужно убрать Date::compare_dates и не передавать альгоритму компаратор:

void Date::sort_dates(Date *dates, const int &num) const
{
       std::sort(dates[0], dates[num - 1]);
}
READ ALSO
DICOM Orthanc. Text Value Attribute(0040,A160)

DICOM Orthanc. Text Value Attribute(0040,A160)

Имеется orthanc-server и проект на C++ с использованием Grassroots DICOMНа сервере имеется запись instance c Text Value Attribute(0040,A160)

134
Задание Кто хочет стать миллионером

Задание Кто хочет стать миллионером

Задали сделать игру Кто хочет стать миллионеромВесь код прописал , сделал вопросы , подсказки

127
Проблема с отрисовкой WinAPI / C++

Проблема с отрисовкой WinAPI / C++

Необходимо создать аналог Марио, желательно не использовать ничего кроме winapi и c++Возникла проблема при отрисовке текстур

100
Regex, а так же конвертация ASCII to UTF8 C++

Regex, а так же конвертация ASCII to UTF8 C++

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

125