2016-09-15 121 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

查看我的更新回答 –