xCode no matching function for call to

252
20 апреля 2017, 17:44

Есть массив объектов в формате 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 = ...

Answer 1

В этом вызове функции 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 , правльно задав выражение аргумента, возможно указав явные для него преобразования, чтобы исключить неоднозначность.

Answer 2

Изменил в шапке код по предыдущему совету.

Я сейчас создал массив из набора символов (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 = ...

READ ALSO
Точка входа не найдена _ZNSt7_

Точка входа не найдена _ZNSt7_

Доброй ночиучу C++ файл компилируется но при запуске выкидывает это

241
C++. Определение длины числа с нуля

C++. Определение длины числа с нуля

Нужно, чтоб программа понимала, что пользователь вводит 01 или 02, а не 1 или 2

195
Считать последнюю строку файла

Считать последнюю строку файла

Доброго времени суток! есть файл который имеет структуру(ниже), надо считать данныеДо последней строки получается

251
cout&lt;&lt;(5&lt;&lt;3)&lt;&lt;endl;

cout<<(5<<3)<<endl;

Почему при выводе: cout<<(5<<3); На экран выводится 40

207