2012-04-30 8 views
8

मैं लूप के लिए पीपीएल और समानांतर_for वाक्यविन्यास का उपयोग कर रहा हूं। कैप्चर क्लॉज में, मेरे पास 3 चर हैं, उनमें से एक क्लास सदस्य है। कैप्चर क्लॉज में चर के बीच वर्ग सदस्य की उपस्थिति के कारण एक संकलन त्रुटि है। हालांकि, अगर मेरे पास लैम्ब्डा बॉडी में यह क्लास सदस्य है, तो यह संकलित नहीं होता है, और त्रुटि बताई गई है कि संलग्न क्षेत्र में वैरिएबल कैप्चर क्लॉज में होना चाहिए। कैसे आगे बढ़ा जाए? क्या मुझे वैरिएबल सदस्य को स्थानीय चर में पहले से कॉपी करना चाहिए, और इसे कैप्चर क्लॉज में पास कर दिया है?सी ++ - लैम्ब्डा अभिव्यक्ति, कैप्चर क्लॉज और क्लास के सदस्यों

यहां कोड है, फॉर्मूला कमांड क्लास सदस्य के साथ कोड है।

parallel_for (m_rowStart,m_rowEnd+1,[&functionEvaluation,varModel_,formulaCommand](int i) 
    {  
      MLEquationVariableModel model_(varModel_); 
      model_.addVariable("i", i); 
      model_.addVariable("j", 1); 
      MLEquationCommand* command_ = formulaCommand->duplicate(&model_); 
      double d = command_->execute().toDouble(); 
      if(d==NO_VALUE) 
      { 
       functionEvaluation.local() = NO_VALUE; 
      } 
      else 
      { 
       functionEvaluation.local() += d; 
      } 
      delete command_; 
    }); 

धन्यवाद!

उत्तर

7

सदस्य चरों तक पहुंचने के लिए आपको this पर कब्जा करने की आवश्यकता है (याद रखें कि formulaCommandthis->formulaCommand के बराबर है)।

[&functionEvaluation, varModel_, this](int i) { ... } 

(Btw, आप शायद एक स्मार्ट सूचक (unique_ptr<MLEquationCommand> का उपयोग करना चाहिए) के बजाय मैन्युअल delete कच्चे सूचक command_ आईएनजी।)

+4

इसके अलावा यह देखते हुए कि सदस्य चर लायक हमेशा से-संदर्भ कब्जा कर लिया है के बाद से वे कर रहे हैं वास्तव में 'इस' के कब्जे वाले संस्करण के माध्यम से पहुंचा। यदि आप किसी सदस्य को मूल्य से कैप्चर करना चाहते हैं, तो उसे स्थानीय पर कॉपी करें और फिर उसे मूल्य से कैप्चर करें। – Potatoswatter

+1

या इस तरह: '[& functionEvaluation, varModel_, =]' –

+0

@KennyTM क्या आप 'unique_ptr <>' के उपयोग पर विस्तार कर सकते हैं, या कुछ प्रासंगिक रेफरी पर इंगित कर सकते हैं? धन्यवाद – octoback

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