Ошибка при сортировке списка со своим типом данных C2064. Результатом вычисления фрагмента не является функция, принимающая 2 аргументов

Рейтинг: -1Ответов: 1Опубликовано: 13.03.2023

Есть классы Car и дочерний Truck с полями скорость и год выпуска. Есть списки ( list<Car> , list<Truck> ) с экземплярами классов, который по этим полям нужно отсортировать. Использую sort() в который передаю компаратор. В чём проблема? Может как-то по-другому можно отсортировать списки по этим полям?

cars.sort(Comparator(*cars.begin(), *cars.end(), *trucks.begin(), *trucks.end(), asc, false, parameter));
trucks.sort(Comparator(*cars.begin(), *cars.end(), *trucks.begin(), *trucks.end(), asc, true, parameter));

Ошибка C2064 результатом вычисления фрагмента не является функция, принимающая 2 аргументов xutility 1137

Код компаратора:

bool Comparator(Car car1, Car car2, Truck truck1, Truck truck2, bool asc, bool truck, string parameter)
{
    if (parameter == "year")
    {
        if (!truck)
        {
            if (asc)
            {
                return car1.year < car2.year;
            }
            else
            {
                return car1.year > car2.year;
            }
        }
        else
        {
            if (asc)
            {
                return car1.year < car2.year;
            }
            else
            {
                return truck1.year > truck2.year;
            }
        }
    }
    else
    {
        if (!truck)
        {
            if (asc)
            {
                return car1.speed < car2.speed;
            }
            else
            {
                return car1.speed > car2.speed;
            }
        }
        else
        {
            if (asc)
            {
                return truck1.speed < truck2.speed;
            }
            else
            {
                return truck1.speed > truck2.speed;
            }
        }
    }
}

Ответы

▲ 0Принят

Если кратко, то компоратор - это функция которая возвращает булево значение от двух аргументов. std::sort - это алгоритм сортировки сравнением, то есть в процессе сортировки происходит многократное попарное сравнение элементов. Передача функции компаратара замещает оператор сравнения <.
Вы же передаете результат вызова функции т.е. булево значение, вместо того чтобы передать указатель на функцию компаратора. Более подробно о подходах к сортировке векторов и массивов структур было отвечено в этом вопросе.
P.S. учитесь гуглить запросы со словом "example", обучение пойдет гораздо быстрее)