0 / 0 / 0
Регистрация: 01.12.2019
Сообщений: 4
1

std::sort/qSort. Реализация сортировки с заданной функцией сортировки в классе. must use '.*' or '->*' to call

01.12.2019, 17:29. Показов 2724. Ответов 6
Метки нет (Все метки)

Доброго времени суток.

Столкнулся с проблемой. Необходимо отсортировать элементы в списке Qt (то бишь QList). Элементы-структуры состоящие из названия элемента и другой, не важной в данном случае, информации.
Заголовочник класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MainWindow : public QMainWindow
{
//...
private:
     
     struct Elem
    {
        QString name = "Unknown";
        //...
    };
QList<Elem> list;
bool elemLessThen(const Elem&, const Elem&);
void updateList();
//...
};
CPP'шник
C++
1
2
3
4
5
6
7
8
9
10
11
//...
bool MainWindow::elemLessThen(const MainWindow::Elem &e1, const MainWindow::Elem &e2)
{
    return e1.name < e2.name;
}
void MainWindow::updateList()
{
    sort(list.begin(), list.end(), &MainWindow::elemLessThen);
    //...
}
//...
Компиляция выводит ошибку вида:
must use '.*' or '->*' to call pointer-to-member function in 'lessThan (...)', e.g. '(... ->* lessThan) (...)'
if (lessThan(*end, *pivot))
^
Что было испробовано: отказ от функции и реализация оператора "<", использовались и qSort, и std::sort. Конкретно под свой случай или что-то подобное я почти ничего не нашёл. Постоянно звучит что-то про "Используй (*this)..." но как я не пытался, не получается.
Реализация через оператор и без функции сравнения убирает ошибку и всё работает как надо.

Как был сделан оператор для структуры:
C++
1
2
3
4
bool operator < (const Elem &elem) const
    {
        return name < elem.name;
    };
Однако хотелось бы знать в чём причина ошибки, и можно ли её исправить.

Всё это тестировалось и в основной программке и в тестовой консольной. Если прописывать всё в main.cpp то нормально работают оба варианта. Всё начинается когда пытаешься использовать функцию для сортировки из класса, как я понял.

Заранее спасибо за советы.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2019, 17:29
Ответы с готовыми решениями:

Возникли трудности с функцией быстрой сортировки qsort
Добрый вечер. Есть массив прямоугольников со своей высотой и шириной, надо отсортировать отдельно...

Какой алгоритм сортировки использует std::sort();
Сколько пользуюсь но не знаю как он работает. Читал что сложность этой сортировки примерно О(n*lgn)

Сравнение алгоритмов сортировки Хоара и std::sort
Собственно в универе было дано задание, написать программу которая принимает на вход из файла в...

Использование std::sort() для сортировки числового массива
Выбивает ошибка что sort перегружены #include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace...

6
Мозгоправ
1737 / 1031 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
01.12.2019, 17:47 2
Лучший ответ Сообщение было отмечено Liners как решение

Решение

Liners,
C++
1
2
3
4
5
6
7
8
9
10
11
//...
static bool MainWindow::elemLessThen(const MainWindow::Elem &e1, const MainWindow::Elem &e2)
{
    return e1.name < e2.name;
}
void MainWindow::updateList()
{
    sort(list.begin(), list.end(), MainWindow::elemLessThen);
    //...
}
//...
Не?
1
0 / 0 / 0
Регистрация: 01.12.2019
Сообщений: 4
01.12.2019, 18:09  [ТС] 3
Компилятор требовал чтобы у меня было написано именно так.
0
Мозгоправ
1737 / 1031 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
01.12.2019, 18:18 4
Liners, а вы мой вариант на пытались ему скормить? Может ему понравится? (Там изменения в двух местах.)
0
0 / 0 / 0
Регистрация: 01.12.2019
Сообщений: 4
01.12.2019, 18:25  [ТС] 5
И правда сработало. Правда static надо было прописать в заголовочные, и ссылки оставить. Можете пояснить в чём фишка?
0
Мозгоправ
1737 / 1031 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
01.12.2019, 20:09 6
Лучший ответ Сообщение было отмечено Liners как решение

Решение

Цитата Сообщение от Liners Посмотреть сообщение
Правда static надо было прописать в заголовочные
Ну да, если у вас есть заголовок/реализация. Просто часто реализацию инлайнят в объявление.
Но главное, что вы меня правильно поняли ))
Цитата Сообщение от Liners Посмотреть сообщение
Можете пояснить в чём фишка?
Фишка в том, что методы класса (которые с квалификатором static), в отличие от методов экземпляра класса, не имеют первого неявного аргумента this.

Таким образом, с точки зрения компилятора, вы пытались ему скормить третьим параметром функции sort() адрес функции с тремя параметрами: bool elemLessThen(MainWindow * const this, const Elem&, const Elem&).

Когда вы сделали operator<() для структуры, он стал подхватываться функцией sort() с двумя параметрами, которая под капотом разворачивается в вызов sort() с тремя параметрами, подставляя третьим параметром operator<().
1
0 / 0 / 0
Регистрация: 01.12.2019
Сообщений: 4
01.12.2019, 22:25  [ТС] 7
Спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2019, 22:25
Помогаю со студенческими работами здесь

Как пользоваться функцией Array.Sort() для сортировки по алфавиту
Всем привет обьясните пожалуйсто как пользоваться функцией Array.Sort(); для сортировке по алфавиту...

Почему стандартная сортировка вектора std::sort намного быстрее сортировки вставками/пузырьком?
Здравствуйте, объясните, пожалуйста, как реализована std::sort. Ясно, что через итераторы, но...

Отличие std::sort От std::qsort
Пишу доклад по программированию, собственно выбрал тему сортировок. вот сейчас хочу расписать...

Реализация методов сортировки и поиска элементов в классе
Что еще можно сделать на ваше мнение? вот задание: Реализация методов сортировки и поиска...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru