2012-04-30 14 views
8

forループを使用するには、PPLとparallel_forの構文を使用しています。 capture節には3つの変数があり、そのうちの1つはクラスメンバーです。キャプチャ句に変数の中にクラスメンバが存在するため、コンパイルエラーが発生します。しかし、このクラスメンバーがラムダ本体にある場合、どちらもコンパイルされず、囲みスコープ内の変数がキャプチャ句になければならないというエラーが表示されます。どうやって進める?変数メンバをローカル変数にあらかじめコピーして、それをキャプチャ句に渡す必要がありますか?C++ - ラムダ式、キャプチャ句、クラスメンバ

ここにコードはありますが、formulaCommandクラスメンバーです。

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) { ... } 

(ところで、あなたはおそらく生のポインタcommand_を-ingスマートポインタ(unique_ptr<MLEquationCommand>)を使用する代わりに、手動でdelete必要があります。)

+4

、彼らがあるので、メンバ変数は常に参照による捕獲されていることは注目に値します実際に 'this'のキャプチャされたバージョンを通してアクセスされました。値でメンバーを取得する場合は、それをローカルにコピーし、値でキャプチャします。 – Potatoswatter

+1

または、次のようにしてください: '[&functionEvaluation、varModel_、=]' –

+0

@KennyTM 'unique_ptr <>'を使用して拡張するか、関連するrefをポイントできますか?ありがとう – octoback