2012-04-30 12 views
8

Estoy usando PPL y la sintaxis parallel_for para tener un ciclo for. En la cláusula de captura, tengo 3 variables, una de ellas es un miembro de la clase. Hay un error de compilación debido a la presencia de un miembro de clase entre las variables en la cláusula de captura. Sin embargo, si tengo este miembro de la clase en el cuerpo lambda, tampoco compila, y el error indicado es que la variable en el alcance adjunto debe estar en la cláusula de captura. ¿Cómo proceder? ¿Debo copiar el miembro variable a una variable local de antemano, y hacer que pase en la cláusula de captura?C++ - expresión lambda, cláusula de captura y miembros de la clase

Aquí está el código, con formulaCommand el miembro de la clase.

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

¡Gracias!

Respuesta

7

Debe capturar this para acceder a las variables miembro (recuerde que formulaCommand es equivalente a this->formulaCommand).

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

(Por cierto, probablemente debería utilizar un puntero inteligente (unique_ptr<MLEquationCommand>) en lugar de manualmente delete -ing el puntero prima command_.)

+4

También digno de mención que las variables de los miembros siempre capturados por referencia ya que son realmente se accede a través de la versión capturada de 'this'. Si desea capturar un miembro por valor, cópielo en un local y luego capture eso por valor. – Potatoswatter

+1

O de esta manera: '[& functionEvaluation, varModel_, =]' –

+0

@KennyTM ¿Podría ampliar el uso de 'unique_ptr <>', o apuntar a alguna referencia relevante? gracias – octoback

Cuestiones relacionadas