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 を指定しようとしました。しかし、それは何の助けにもなりませんでした。