2016-09-15 100 views
-1

我只是無法得到QtConcurrent ::運行與重載靜態方法工作:QtConcurrent ::重載的靜態方法運行

class Foobar { 
public: 
    static ResType foo(const cv::Mat& data, const QStringList& names, int clusters = 5); 
    static ResType foo(const cv::Mat& data, const cv::TermCriteria& tc, const QStringList& names, const QStringList& otherNames, int clusters, int covType = 2); 
} 

QtConcurrent::run(
    static_cast<ResType (*)(const cv::Mat&, const cv::TermCriteria&, 
     const QStringList&, const QStringList&, int, int)>(&Foobar::foo), 
     sampleData, tc, mDimNames, mGmmNames, mClusterN, mCovType); 

我得到:

error: no matching function for call to ‘run(ResType (*)(const cv::Mat&, const cv::TermCriteria&, const QStringList&, const QStringList&, int, int), cv::Mat&, cv::TermCriteria&, QStringList&, QStringList&, int&, int&)’ sampleData, tc, mDimNames, mGmmNames, mClusterN, mCovType);

注裁判(& )在整數參數的錯誤消息中。這令我感到困惑....

類型則params的:

cv::Mat sampleData, cv::TermCriteria tc, QStringList mDimNames, QStringList mGmmNames, int mClusterN, int mCovType 

我以爲的static_cast將與區分重載幫助。我能看到的唯一區別是,參數部分不是常量。但你可以採取一個值類型參數,所以爲什麼會這麼重要...

+0

您的問題中的代碼是原件和您爲發佈而編輯的代碼的混合,盡我所能猜到。 ('DkGmm'或'Foobar'?'Foobar'在命名空間'bla'中?)使它一致可以幫助理解正在發生的事情。 –

+0

對不起,我修正了它 –

回答

1

答案是靜態成員函數類型是一個常規函數,而不是一個成員函數,因爲它沒有隱含this,因此在編譯問題之後應該從*之前刪除Foobar::部分。

編輯:

問題編輯和OP添加的答案後,我想提一提,std::bind是不是一個很好的解決方案。這非常容易出錯,特別是在「get by ref」周圍,如果你不太小心,它很容易成爲副本。更好的解決方案是使用lambda代替。例如:

auto future = QtConcurrent::run([&]{ 
    DkGmm::fromData(sampleData, tc, mDimNames, mGmmNames, mClusterN, mCovType); }); 

(在實際的代碼,我可能會抓住每一個論點明確,因爲我覺得用默認的捕獲是不好的做法™)

+0

這是正確的,我已經修復了。我仍然遇到錯誤。我會更新這個問題。另外,我剛剛通過使用std :: bind解決了我的問題。我已經在寫它了。 –

+0

你能指出爲什麼它不是一個好的解決方案嗎?關於「容易出錯」,你是指劇組中的簽名還是還有其他需要注意的地方? –

+0

引用自己:「尤其是」通過參考「,如果你不是很小心,很容易成爲副本。」我敢肯定你會在那裏得到副本,因爲你沒有爲傳遞給bind的每個參數使用'std :: cref()'。如果你不相信我,請從Scott Meyers(Effective Modern C++,Item 34:喜歡lambdas到std :: bind)。 –

0

的std ::綁定到拯救。出於某種原因,它可以找出正確的類型:

#include <functional> 

void test() { 
    auto fn = std::bind(
     static_cast<DkGmm (*)(const cv::Mat&, const cv::TermCriteria&, const QStringList&, const QStringList&, int, int)>(&DkGmm::fromData), 
     sampleData, tc, mDimNames, mGmmNames, mClusterN, mCovType); 

    auto future = QtConcurrent::run(fn); 
// ...code... 
} 
+0

查看我的更新回答 –