Локальная переменная вложенной функции не может быть указана в теле лямбда, если только она не находится в списке захвата
У меня есть объект json:: value, и я пытаюсь получить значения в структуре, но я получаю эту ошибку в списке захвата. Я понимаю, что в этой фразе этот bracet [] содержит список захвата, но я не могу понять, как это сделать. Как я могу вернуть значение в лямбда-функции?
void JsonDeneme::setValues(json::value obj)
{
weather.coord.lon = obj.at(L"coord").at(L"lon").as_double();
weather.coord.lat= obj.at(L"coord").at(L"lat").as_double();
}
void JsonDeneme::getHttp()
{
//json::value val;
http_client client(U("http://api.openweathermap.org/data/2.5/weather?q=Ankara,TR"));
client.request(methods::GET)
.then([](http_response response) -> pplx::task<json::value>
{
if (response.status_code() == status_codes::OK)
{
printf("Received response status code:%u\n", response.status_code());
return response.extract_json();
}
return pplx::task_from_result(json::value());
})
.then([ ](pplx::task<json::value> previousTask)
{
try
{
json::value v = previousTask.get();
setValues(v);//-----------------------------------------
}
catch (http_exception const & e)
{
wcout << e.what() << endl;
}
})
.wait();
}
Ответы
Ответ 1
Список захвата - это то, что вы положили между квадратными скобками. Посмотрите на этот пример:
void foo()
{
int i = 0;
[]()
{
i += 2;
}
}
Здесь лямбда ничего не захватывает, поэтому она не будет иметь доступ к охватывающей области и не будет знать, что такое i
. Теперь позвольте захватить все по ссылке:
void foo()
{
int i = 0;
[&]()//note the &. It means we are capturing all of the enclosing variables by reference
{
i += 2;
}
cout << 2;
}
В этом примере i
внутри lambda является ссылкой на i
в охватывающей области.
В вашем примере у вас есть лямбда внутри член-функции объекта. Вы пытаетесь вызвать функцию объекта: setValues(v)
, но ваш список захвата пуст, поэтому ваша лямбда не знает, что такое setValues
. Теперь, если вы запишете this
в лямбда, лямбда будет иметь доступ ко всем методам объектов, потому что setValues(v)
в вашем случае будет таким же, как this->setValues(v)
, и ошибка исчезнет.