un enfermant-fonction d'une variable locale ne peut pas être référencée dans un corps de lambda, sauf si elle est dans la liste de capture
J'ai json::valeur de l'objet et j'essaie d'obtenir des valeurs dans une structure (struct) mais j'ai cette erreur au sujet de la capture de la liste. Je comprends que dans cette phrase bracet [] conserve la capture de liste, mais je ne peux pas comprendre comment. Comment puis-je retourner une valeur dans une fonction 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();
}
- Quelle est l'erreur que vous obtenez?
- un enfermant-fonction d'une variable locale ne peut pas être référencée dans un corps de lambda, sauf si elle est dans la liste de capture
- ce problème est résolu quand j'ai ajouté [cela], mais j'essaie de comprendre pourquoi
Vous devez vous connecter pour publier un commentaire.
La capture liste de ce que vous mettez entre crochets. Regardez cet exemple:
Ici le lambda ne capte rien, donc il n'aura pas accès à l'affichage de la portée, et ne savent pas ce qu'
i
est. Maintenant, nous allons capturer tout par la référence:Dans cet exemple, le
i
à l'intérieur de la lambda est une référence à lai
dans le cadre englobant.Dans votre exemple, vous avez un lambda à l'intérieur de l'un des membres de la fonction d'un objet. Vous tentez d'appeler la fonction de l'objet:
setValues(v)
, mais votre liste de capture est vide, donc votre lambda ne sait pas cesetValues
est. Maintenant, si vous capturezthis
dans le lambda, le lambda aura accès à l'ensemble des méthodes de l'objet, parce quesetValues(v)
est le même quethis->setValues(v)
dans votre cas, et l'erreur a disparu.