Есть массив объектов в формате json. Что то не могу запустить функцию удаления дубликатов объектов. Что не так делаю, подскажите.
#include <iostream>
#include <set>
#include <string>
#include "ArduinoJson.h"
void removeDuplicates(JsonArray& array) {
std::set<std::string> seenValues;
for (JsonArray::iterator it = array.begin(); it != array.end(); ++it) {
JsonObject& element = *it;
bool isNew = seenValues.insert(element["K"]).second;
if (!isNew) array.remove(it);
std::cout << element["K"] << std::endl;
}
}
int main() {
char json[] = "[{\"K\":\"1\"},{\"K\":\"2\"},{\"K\":\"1\"},{\"K\":\"1\"},{\"K\":\"2\"}]";
DynamicJsonBuffer jb;
JsonArray& IPList = jb.parseArray(json);
removeDuplicates(IPList);
std::cout << IPList << std::endl;
return 0;
}
Компилятор ругается Call to member function 'insert' is ambiguous на строке bool isNew = ...
В этом вызове функции removeDuplicates
std::string out = removeDuplicates(json);
вызывается конструктор преобразования, который из объекта типа char *, в который неявно преобразуется символьный массив json, строит временный объект типа JsonArray. Вы не можете привязывать неконстантную ссылку к временному объекту. Поэтому компилятор не может вызывать объявленную вами функцию и ищет функцию, которую он мог бы вызвать для временного объекта. Такой функции нет, и компилятор об этом сообщает.
Возможным решением в этом случае может быть создание объекта типа JsonArray в main и использование его в качестве аргумента. Например,
JsonArray array( json );
std::string out = removeDuplicates( array );
Что касается второго сообщения об ошибке, то оно является следствием того, какой тип имеет объект, возвращаемый оператором element["K"]. Похоже, этот объект не имеет тип std::string, а потому вследствии возможных неявных преобразований возникает неоднозначность вызова функции-члена класса insert для этого объекта.
Вам надо посмотреть по документации, какой тип имеет возвращаемое значение оператора в вашем случае и вызывать функцию insert , правльно задав выражение аргумента, возможно указав явные для него преобразования, чтобы исключить неоднозначность.
Изменил в шапке код по предыдущему совету.
Я сейчас создал массив из набора символов (char json), потом ее распарсил библиотекой и получил валидный json (убираются экранирующие слеши) [{"K":"1"},{"K":"2"},{"K":"1"},{"K":"1"},{"K":"2"}].
Для теста вывел в консоль element["K"] из цикла for и имею зачения ключей К из всех объектов массива: "1" "2" "1" "1" "2"
Компилятор ругается Call to member function 'insert' is ambiguous на строке bool isNew = ...
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости