QtConcurrent を使用して、特定のタスクを並行して実行しています。ただし、マップの代わりにmappedReducedを使用するように変更すると、問題が発生しました。
これが私が使用したコードです:
struct ProcMapWrapper {
  ConcurrentProcessTask *instance;
  ProcMapWrapper(ConcurrentProcessTask *w): instance(w) {}
  QString & operator()(const QString& data) {
    return instance->map(data);
  }
  ProcMapWrapper(const ProcMapWrapper & src)
  {
      instance = src.instance;
  }
  typedef QString result_type;
};
struct ProcReduceWrapper {
  ConcurrentProcessTask *instance;
  ProcReduceWrapper(ConcurrentProcessTask *w): instance(w) {}
  void operator()(int &number, const QString &fname) {
    return instance->reduce(number,fname);
  }
  ProcReduceWrapper(const ProcReduceWrapper & src)
  {
      instance = src.instance;
  }
  typedef int result_type;
};
ProcMapWrapper mw(this);
ProcReduceWrapper rw(this);
futureWatcher.setFuture(QtConcurrent::mappedReduced(_files.begin(),_files.end(),mw,rw));
アイデアは、processOneItem 関数を使用して入力文字列から stage1Data 構造体を生成し、reduce 関数でクリアして結果を適切なコンテナーに保存することです。
私は、これらのコード スニペットを参照するこのソース ファイルにたどり着いた、ちょっとした調査を行いました。そこには、マップファンクターのテンプレートが次のように指定されています。
struct Scaled 
{ 
     Scaled(int size) 
     : m_size(size) { } 
     typedef QImage result_type; 
     QImage operator()(const QImage &image) 
     { 
         return image.scaled(m_size, m_size); 
     } 
     int m_size; 
}; 
 QList<QImage> images = ...; 
 QFuture<QImage> thumbnails = QtConcurrent::mapped(images, Scaled(100));
これは実際に QtConcurrent の機能で機能しますが、同じパターンで reduce ファンクターを作成しようとすると、これらのエラーが再び発生しますmap。mapped
..\qt_photoaud\task.cpp(230): エラー C2893: 関数テンプレート 'QFuture::ResultType> QtConcurrent::mappedReduced(Iterator,Iterator,MapFunctor,ReduceFunctor,QtConcurrent::ReduceOptions)' を次のテンプレート引数で特殊化できませんでした: 'QList::iterator' with [ T=QString ] 'ProcMapWrapper' 'ProcReduceWrapper' ..\qt_photoaud\task.cpp(230) : エラー C2783: 'QFuture QtConcurrent::mappedReduced(Iterator,Iterator,MapFunctor,ReduceFunctor,QtConcurrent ::ReduceOptions)' : 'ResultType' のテンプレート引数を推測できませんでした c:\qt\4.8.4\include\qtcore../../src/corelib/concurrent/qtconcurrentmap.h(152) : ' の宣言を参照してくださいQtConcurrent::mappedReduced' ..\qt_photoaud\task.cpp(230) :エラー C2893: 関数テンプレートの特殊化に失敗しました 'QFuture::ResultType> QtConcurrent::mappedReduced(const Sequence &,MapFunctor,ReduceFunctor,QtConcurrent::ReduceOptions)' 次のテンプレート引数: 'QList::iterator' with [ T=QString ] 'QList::iterator' with [ T=QString ] 'ProcMapWrapper' ..\qt_photoaud\task.cpp(230): エラー C2783: 'QFuture QtConcurrent::mappedReduced(const Sequence &,MapFunctor,ReduceFunctor,QtConcurrent::ReduceOptions )' : 'ResultType' c:\qt\4.8.4\include\qtcore../../src/corelib/concurrent/qtconcurrentmap.h(125) のテンプレート引数を推測できませんでした: 'QtConcurrent:: の宣言を参照してくださいマップされたReduced'
reduce functor は本当に定義および/または認識されていますか? QtPrivate::ReduceResultType::ResultType はどのように機能しますか? 何が必要ですか?
編集: functor が boost::function と互換性があると仮定して、reduce functor で first_argument_type、second_argument_type、arg1_type、および arg2_type を指定しようとしました。しかし、それは何の助けにもなりませんでした。