2012-04-30 11 views
8

Ich benutze PPL und parallel_for-Syntax, um eine for-Schleife zu haben. In der Capture-Klausel habe ich 3 Variablen, eine davon ist ein Klassenmitglied. Aufgrund des Vorhandenseins eines Klassenmembers unter Variablen in der capture-Klausel liegt ein Kompilierungsfehler vor. Wenn ich jedoch dieses Klassenmitglied in lambda body habe, wird es auch nicht kompiliert, und der angegebene Fehler besagt, dass die Variable im umschließenden Bereich in der capture-Klausel enthalten sein sollte. Wie geht es weiter? Soll ich das variable Mitglied vorher in eine lokale Variable kopieren und in der capture-Klausel übergeben?C++ - Lambda-Ausdruck, Capture-Klausel und Klassenmitglieder

Hier ist der Code, mit formulaCommand das Klassenmitglied.

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

Vielen Dank!

Antwort

7

Sie müssen this erfassen, um auf die Elementvariablen zuzugreifen (denken Sie daran, dass formulaCommand äquivalent zu this->formulaCommand ist).

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

(BTW, sollten Sie vielleicht einen Smart-Pointer verwenden (unique_ptr<MLEquationCommand>) anstelle von manuell delete -ing den Rohzeiger command_.)

+4

auch erwähnenswert, dass Membervariablen werden immer von Verweis erfasst, da sie wirklich zugegriffen durch die erbeutete Version von 'this'. Wenn Sie ein Element nach Wert erfassen möchten, kopieren Sie es in einen lokalen Wert, und erfassen Sie den Wert dann nach Wert. – Potatoswatter

+1

Oder wie folgt: '[& functionEvaluation, varModel_, =]' –

+0

@KennyTM Könnten Sie die Verwendung von 'unique_ptr <>' erweitern, oder zeigen Sie auf einige relevante Ref? danke – octoback

Verwandte Themen