2014-11-13 2 views
17

मेरे पास json :: value ऑब्जेक्ट है और मैं संरचना में मान प्राप्त करने का प्रयास करता हूं लेकिन मुझे कैप्चर सूची के बारे में यह त्रुटि मिलती है। मैं समझता हूं कि उस वाक्यांश में इस ब्रैकेट [] में कैप्चर सूची है लेकिन मैं यह समझ नहीं सकता कि कैसे। मैं लैम्ब्डा फ़ंक्शन में एक मूल्य कैसे वापस कर सकता हूं?एक संलग्न-फ़ंक्शन स्थानीय चर को लैम्ब्डा बॉडी में संदर्भित नहीं किया जा सकता है जब तक कि यह कैप्चर सूची में नहीं है

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

आपको क्या त्रुटि मिल रही है? – SingerOfTheFall

+0

एक संलग्न-फ़ंक्शन स्थानीय चर को लैम्ब्डा बॉडी में संदर्भित नहीं किया जा सकता है जब तक कि यह कैप्चर सूची – user2957741

+0

में नहीं है, यह तय किया गया है जब मैंने इसे जोड़ा [लेकिन] लेकिन मैं समझने की कोशिश करता हूं कि क्यों – user2957741

उत्तर

31

कैप्चर-सूची वह है जिसे आपने स्क्वायर ब्रैकेट के बीच रखा है। इस उदाहरण को देखो:

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

यहाँ लैम्ब्डा कुछ भी कब्जा नहीं है, इस प्रकार यह enclosing गुंजाइश के लिए पहुँच नहीं होगा, और पता नहीं होगा क्या 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 लैम्ब्डा के अंदर संलग्न दायरे में i लिए एक संदर्भ है।

आपके उदाहरण में, आपके पास किसी ऑब्जेक्ट के सदस्य-फ़ंक्शन के अंदर लैम्ब्डा है। आप ऑब्जेक्ट के फ़ंक्शन को कॉल करने का प्रयास कर रहे हैं: setValues(v), लेकिन आपकी कैप्चर सूची खाली है, इसलिए आपका लैम्ब्डा नहीं जानता कि setValues क्या है। अब, यदि आप लैम्ब्डा में this पर कब्जा करते हैं, तो लैम्ब्डा के पास ऑब्जेक्ट के सभी तरीकों तक पहुंच होगी, क्योंकि setValues(v) आपके मामले में this->setValues(v) जैसा ही है, और त्रुटि समाप्त हो जाएगी।

+2

आपको अवधारणा को समझने के लिए बहुत धन्यवाद। सभी विज्ञापन करने के लिए मुझे [इस] का उपयोग करना चाहिए। – user2957741

+0

लैम्ब्डा अभिव्यक्तियों के साथ कैप्चर सूचियों को समझने के लिए स्पष्ट रूप से व्यक्त और आसान है। स्पष्टता और संक्षिप्तता के लिए +1। इसलिए अक्सर उत्तर की अभिव्यक्ति में स्पष्टीकरण जटिल होते हैं। – Mushy

संबंधित मुद्दे

 संबंधित मुद्दे