Есть массив объектов в формате 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 = ...
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Доброй ночиучу C++ файл компилируется но при запуске выкидывает это
Нужно, чтоб программа понимала, что пользователь вводит 01 или 02, а не 1 или 2
Доброго времени суток! есть файл который имеет структуру(ниже), надо считать данныеДо последней строки получается