我有json :: value对象,我尝试在一个结构体中获取值,但是我收到关于捕获列表的这个错误.我明白,在这个短语中,这个bracet []保存捕获列表,但我不知道如何.如何在lambda函数中返回值?
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(); }
解决方法
捕获列表是您放在方括号之间的.看这个例子:
void foo() { int i = 0; []() { i += 2; } }
在这里,lambda不捕获任何东西,因此它将无法访问封闭的范围,并且不知道我是什么.现在,让我们通过引用来捕捉所有内容:
void foo() { int i = 0; [&]()//note the &. It means we are capturing all of the enclosing variables by reference { i += 2; } cout << 2; }
在这个例子中,lambda中的i是在包围范围内对i的引用.
在你的例子中,你在一个对象的成员函数中有一个lambda.你试图调用对象的函数:setValues(v),但是你的捕获列表是空的,所以你的lambda不知道什么是setValues.现在,如果您在lambda中捕获这个,lambda将可以访问所有对象的方法,因为setValues(v)与您的情况下的setValues(v)相同,错误将会消失.