2017-08-15 13 views
0

我試圖用QtConcurrent:mappedReduced,但它不是與文檔description.I'm獲得4個錯誤與此代碼的簡單:Qt的 - 調用mappedReduced

我使用Qt 5.9。 1 MSVC-2015

//....................... 
QMap<QString,QString> TesseractAPI::analyze(QStringList singleData); 

void joinMaps(QMap<QString,QString> map, const QMap<QString,QString> partial); 
//............. 
QMap<QString, QString> TesseractAPI::analyzeAll(QList<QStringList> data){ 

    /*QFuture< QMap<QString,QString> > res*/; 
    QFuture< QMap<QString,QString> > res = QtConcurrent::mappedReduced(data, TesseractAPI::analyze, joinMaps); // I tried adding '&' before the functors 
    res.waitForFinished(); 
    qDebug()<<res.result(); 
    return res.result(); 

} 

編譯器錯誤:

C2780: 'QFuture<QtPrivate::ReduceResultType<ReduceFunctor>::ResultType> QtConcurrent::mappedReduced(Iterator,Iterator,MapFunctor,ReduceFunctor,QtConcurrent::ReduceOptions)': expects 5 arguments - 3 provided 

C2780: 'QFuture<T> QtConcurrent::mappedReduced(Iterator,Iterator,MapFunctor,ReduceFunctor,QtConcurrent::ReduceOptions)': expects 5 arguments - 3 provided 

C2780: 'QFuture<T> QtConcurrent::mappedReduced(Iterator,Iterator,MapFunctor,ReduceFunctor,QtConcurrent::ReduceOptions)': expects 5 arguments - 3 provided 

C2783: 'QFuture<T> QtConcurrent::mappedReduced(const Sequence &,MapFunctor,ReduceFunctor,QtConcurrent::ReduceOptions)': could not deduce template argument for 'ResultType' 

我試圖改變數據類型,我也跟着個例子e編譯罰款的文檔,但我無法找到問題在我的代碼中持續存在的位置。

回答

1

你錯過了很多&'s。 首先,你應該通過const的裁判將數據傳遞給analyzeAll(),不可複製:

QMap<QString, QString> TesseractAPI::analyzeAll(const QList<QStringList>& data){ 

接下來,你應該通過const的裁判通過項目映射函數,而不是複製。因爲它是一個類的成員函數也需要是靜態的,否則你必須知道哪個對象調用它,但有沒有這樣的mappedReduced()過載:

static QMap<QString,QString> TesseractAPI::analyze(const QStringList& singleData); 

接着,對於降低功能需求的第一個參數作爲參考,否則你會修改本地副本,這將是無用的。你正在減少的東西也應該通過const ref傳遞,以避免不必要的複製:

void joinMaps(QMap<QString,QString>& map, const QMap<QString,QString>& partial); 

現在它應該工作。爲了闡明你的意圖的緣故,也是不錯的明確添加&的函數指針,所以沒有混淆它們是什麼:

QFuture< QMap<QString,QString> > res = QtConcurrent::mappedReduced(data, &TesseractAPI::analyze, &joinMaps); 
+0

我不能把「分析」靜態,因爲它需要訪問私有成員變量 – pourjour

+1

指向成員的指針僅支持容器元素類,即在這種情況下爲QStringList的成員。由於您需要一個不相關對象的無關函數,因此您需要將其包裝到函數對象中,如下所述:http://doc.qt.io/qt-5/qtconcurrentmap.html#using-function-objects – chrisaverage