2012-11-19 19 views
18

निम्नलिखित कार्यक्रम पर कब्जा कर लिया नहीं है संकलन नहीं है:लैम्ब्डा: समारोह

#include <iostream> 
#include <vector> 
#include <functional> 
#include <algorithm> 
#include <cstdlib> 
#include <cmath> 

void asort(std::vector<double>& v, std::function<bool(double, double)> f) 
{ 
    std::sort(v.begin(), v.end(), [](double a, double b){return f(std::abs(a), std::abs(b));}); 
} 

int main() 
{ 
    std::vector<double> v({1.2, -1.3, 4.5, 2.3, -10.2, -3.4}); 
    for (unsigned int i = 0; i < v.size(); ++i) { 
     std::cout<<v[i]<<" "; 
    } 
    std::cout<<std::endl; 
    asort(v, [](double a, double b){return a < b;}); 
    for (unsigned int i = 0; i < v.size(); ++i) { 
     std::cout<<v[i]<<" "; 
    } 
    std::cout<<std::endl; 
    return 0; 
} 

है क्योंकि:

error : 'f' is not captured 

इसका क्या मतलब है और कैसे समस्या को हल करने?

उत्तर

37

आप asort() के अंदर लैम्ब्डा में f पैरामीटर का उपयोग करते हैं, लेकिन आप इसे कैप्चर नहीं करते हैं। कैप्चर सूची में f जोड़ने का प्रयास करें (पढ़ने के लिए [] बदलें)।

+7

या इसे '[&] 'के संदर्भ में भी कैप्चर करें। – Cameron

+0

हाँ, आप सही हैं, मैंने अपना जवाब अपडेट कर लिया है। किसी कारण से मैंने बहुत तेज़ पढ़ा और सोचा कि 'एफ' एक फ़ंक्शन पॉइंटर था, फ़ंक्शन ऑब्जेक्ट नहीं। – cdhowie

7

आप प्रभावी रूप से एफ का संदर्भ दे रहे हैं, जो आपके लम्बा में बाहरी दायरे में एक चर है। संदर्भ में सबकुछ कैप्चर करने के लिए आपको इसे अपनी कैप्चर सूची में कैप्चर करना चाहिए (संभवतः संदर्भ [& एफ], या [&] संदर्भ में सब कुछ है, क्योंकि आप इसे तुरंत उपयोग कर रहे हैं)।

एक और नोट पर, std :: फ़ंक्शन में कुछ ओवरहेड होता है क्योंकि यह टाइप एरर करता है, यहां आपके मामले में टेम्पलेट प्रकार को पेश करना बेहतर हो सकता है।

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