我无法让QtConcurrent :: run使用重载的静态方法:
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);
我明白了:
错误:没有匹配函数来调用'run(ResType(*)(const cv :: Mat&amp;,const cv :: TermCriteria&amp;,const QStringList&amp;,const QStringList&amp;,int,int),cv :: Mat&amp; ;,cv :: TermCriteria&amp;,QStringList&amp;,QStringList&amp;,int&amp;,int&amp;)' sampleData,tc,mDimNames,mGmmNames,mClusterN,mCovType);
请注意整数参数的错误消息中的ref(&amp;)。这让我很困惑......
params的类型:
cv::Mat sampleData, cv::TermCriteria tc, QStringList mDimNames, QStringList mGmmNames, int mClusterN, int mCovType
我认为static_cast有助于区分重载。我能看到的唯一区别是,params部分不是const。但是你可以使用一个值类型参数的const引用,那么为什么会这么重要......
答案 0 :(得分:2)
答案是静态成员函数类型是常规函数,而不是成员函数,因为它没有隐式this
,因此在{{1}之前删除Foobar::
部分自编译问题以来应该。
编辑:
在问题版本和OP添加的答案之后,我想提一下*
不是一个很好的解决方案。它非常容易出错,特别是在&#34; get by ref&#34;如果你不是很小心的话很容易成为副本。更好的解决方案是使用lambda代替。 E.g:
std::bind
(在实际代码中,我可能会明确地捕获每个参数,因为我认为使用默认捕获是Bad Practice™。)
答案 1 :(得分: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...
}