2016-09-15 15 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 бы помочь отличить перегруженные. Единственное различие, которое я вижу, состоит в том, что параметры частично не const. Но вы можете взять const ref для параметра типа значения, так почему это имеет значение ...

+0

Код в вашем вопросе - это сочетание оригинала и того, которое вы редактировали для публикации, насколько я могу догадаться. ('DkGmm' или' Foobar'? 'Foobar' находится в пространстве имен' bla'?) Обеспечение согласованности может помочь понять, что происходит. –

+0

Извините, я исправил его –

ответ

1

Ответ заключается в том, что статический член-тип функции является регулярной функцией, а не функцией-членом, поскольку она не имеет неявный this, поэтому удаление части Foobar:: до * следует с момента выпуска компиляции.

Edit:

После вопроса редакции и ответ добавленной ОП, я хочу отметить, что std::bind не является отличным решением. Это очень подвержено ошибкам, особенно вокруг «get by ref», который легко становится копией, если вы не очень осторожны. Лучшее решение - использовать лямбда вместо этого. Например:

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

(В реальном коде, я бы, вероятно, захватить каждый из аргументов в явном виде, как я думаю, что с помощью захвата по умолчанию является плохой практикой ™.)

+0

Правильно, я уже исправил это. Я все еще получаю сообщение об ошибке. Я уточню вопрос. Кроме того, я только что решил свою проблему, используя std :: bind. Я уже пишу это. –

+0

Не могли бы вы указать, почему это не отличное решение? Что касается «ошибки, подверженной ошибкам», ссылаетесь ли вы на подпись в броске или есть ли что-нибудь еще, чтобы ее можно было наблюдать? –

+0

Цитируя себя: «особенно вокруг« get ref », который легко становится копией, если вы не очень осторожны». Я уверен, что вы получаете копии там, потому что вы не использовали 'std :: cref()' для каждого из аргументов, переданных 'bind'. Если вы мне не верите, возьмите его у Скотта Майерса (Эффективный современный C++, Item 34: Предпочитайте lambdas для std :: bind). –

0

зОго :: связывается с спасение. По какой-то причине он может определить правильный тип:

#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

См. Мой обновленный ответ –

 Смежные вопросы

  • Нет связанных вопросов^_^