2014-11-13 8 views
17

Ho json :: value object e cerco di ottenere valori in una struct ma ottengo questo errore sulla lista di cattura. Capisco che in questa frase questo bracet [] contiene la lista di cattura ma non riesco a capire come. Come posso restituire un valore nella funzione lambda?una variabile locale della funzione di inclusione non può essere referenziata in un corpo lambda a meno che non sia nella lista di cattura

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

Qual è l'errore che stai ottenendo? – SingerOfTheFall

+0

una variabile locale di funzione di inclusione non può essere referenziata in un corpo lambda a meno che non sia nella lista di cattura – user2957741

+0

questo è corretto quando ho aggiunto [questo] ma cerco di capire perché – user2957741

risposta

31

La lista di cattura è ciò che si inserisce tra parentesi quadre. Guarda questo esempio:

void foo() 
{ 
    int i = 0; 
    []() 
    { 
     i += 2; 
    } 
} 

Qui il lambda non catturare qualsiasi cosa, quindi non avrà accesso al campo di applicazione che racchiude, e non sa che cosa è i. Ora, cerchiamo di catturare tutto per riferimento:

void foo() 
{ 
    int i = 0; 
    [&]()//note the &. It means we are capturing all of the enclosing variables by reference 
    { 
     i += 2; 
    } 
    cout << 2; 
} 

In questo esempio, il i all'interno della lambda è un riferimento al i nell'ambito di inclusione.

Nel tuo esempio, hai un lambda all'interno di una funzione membro di un oggetto. Stai provando a chiamare la funzione dell'oggetto: setValues(v), ma l'elenco di acquisizione è vuoto, quindi il tuo lambda non sa cosa sia setValues. Ora, se acquisisci this nel lambda, il lambda avrà accesso a tutti i metodi dell'oggetto, perché setValues(v) è lo stesso di this->setValues(v) nel tuo caso e l'errore sarà scomparso.

+2

grazie mille capisco il concetto. per pubblicizzare tutto dovrei usare [questo]. – user2957741

+0

Elenchi di cattura così chiaramente espressi e facili da capire con espressioni lambda. +1 per chiarezza e brevità. Così spesso le spiegazioni sono troppo complicate nella loro espressione di una risposta. – Mushy

Problemi correlati