Есть пара вещей, которые нужно исправить.Во-первых, вот мое решение и ниже некоторые пояснения:
Решение
inline void swap(QJsonValueRef v1, QJsonValueRef v2)
{
QJsonValue temp(v1);
v1 = QJsonValue(v2);
v2 = temp;
}
std::sort(toys.begin(), toys.end(), [](const QJsonValue &v1, const QJsonValue &v2) {
return v1.toObject()["name"].toString() < v2.toObject()["name"].toString();
});
Объяснение
Аргументы сравнения
Одна из ошибок, которые у вас были:
no matching function for call to object of type '(lambda at xxxxxxxx)'
if (__comp(*--__last, *__first))
^~~~~~
...
candidate function not viable: no known conversion from 'QJsonValueRef' to 'const QJsonObject' for 1st argument
std::sort(toys.begin(), toys.end(), [](const QJsonObject &v1, const QJsonObject &v2) {
^
...
Итератор не знает, что ваши элементы массива имеют тип QJsonObject
.Вместо этого он видит их как общий тип QJsonValue
.Нет автоматического преобразования в QJsonObject
, поэтому выдается ошибка с вашей лямбда-функцией.
Замените const QJsonObject &
на const QJsonValue &
для обоих лямбда-аргументов.Затем обработайте преобразование в QJsonObject
тип явно в теле функции: v1.toObject()...
вместо v1...
.
Нет функции подкачки!
Одна из ваших ошибок:
no matching function for call to 'swap'
swap(*__first, *__last);
^~~~
Как обсуждалось в отчете об ошибке Qt QTBUG-44944 , Qt не предоставляет реализацию для переключения между двумя QJsonValue
элементами в массиве.Благодаря репортеру об ошибках Кейту Гарднеру мы можем включить нашу собственную функцию подкачки.Как предлагается в отчете, вы можете поместить это как встроенную функцию в глобальный заголовочный файл.