2012-04-30 22 views
8

For döngüsüne sahip olmak için PPL ve parallel_for sözdizimini kullanıyorum. Yakalama maddesinde 3 değişkenim var, bunlardan biri sınıf üyesi. Yakalama maddesindeki değişkenler arasında bir sınıf üyesinin varlığı nedeniyle bir derleme hatası var. Ancak, eğer lambda bedeninde bu sınıf üyeye sahip olsaydım, bu, ya derleme yapmaz ve hata, kapsamın kapsamındaki değişkenin yakalama maddesi olması gerektiğidir. Nasıl devam edilir? Değişken üyeyi önceden bir yerel değişkene kopyalayıp yakalama maddesine geçirmeli miyim?C++ - lambda ifadesi, yakalama maddesi ve sınıf üyeleri

Buradaki kod, sınıf üyesi formülüCommand ile.

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_; 
    }); 

Teşekkürler!

cevap

7

Üye değişkenlerine erişmek için this kodunu yakalamanız gerekir (unutmayın, formulaCommand'un this->formulaCommand'a eşdeğer olduğunu unutmayın). olduklarını beri

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

(BTW, muhtemelen akıllı işaretçi (unique_ptr<MLEquationCommand> kullanmalıdır) yerine elle delete ham işaretçi command_ -ing.)

o üye değişkenleri Ayrıca belirterek değer
+4

daima referans ile yakalanır Bu 'yakalanan' sürümünden gerçekten erişildi. Bir üyeyi değer olarak yakalamak istiyorsanız, onu bir yerel kopyaya kopyalayın ve ardından bu değeri yakalayın. – Potatoswatter

+1

Veya bunun gibi: '[& functionEvaluation, varModel_, =]' –

+0

@KennyTM 'unique_ptr <> 'kullanımını genişletebilir misiniz, ya da bazı ilgili ref işaret edebilir misiniz? teşekkürler – octoback