QtConcurrent с функцией-членом - PullRequest
5 голосов
/ 03 апреля 2012

Я создаю QFuture, который хочу использовать для распараллеливания вызовов функции-члена.Точнее, у меня есть класс solveParallel с .h:

class solverParallel {
public:
  solverParallelData(Manager* mgr_);
  virtual ~solverParallel(void);

  void runCompute(solveModel * model_);

  bool resultComput();

private:
  Manager *myMgr;
  QFuture<bool> myFutureCompute;
}; 

, где метод runCompute () создает член myFutureCompute..cpp выглядит так:

solveParallel::solveParallel(Manager* mgr_)
:m_mgr(mgr_)
{
}

solverParallel::~solverParallel(void){}

void solverParallel::runCompute(solveModel* model)
{
  futureComput = QtConcurrent::run(&this->myMgr,&Manager::compute(model));
}

bool solverParallelData::resultComput()
{
  return m_futureComput.result();
}

Включить (ы) все в порядке.Компиляция завершается неудачно, в строке

futureComput = QtConcurrent::run(&this->myMgr,&Manager::compute(model));

с этой ошибкой:

Error   44  error C2784: 'QFuture<T> QtConcurrent::run(T (__cdecl *)(Param1),const     Arg1 &)' : could not deduce template argument for 'T (__cdecl *)    (Param1)' from 'Manager **'   solverparallel.cpp 31

Кроме того, при отображении информации мыши для '& Manager' в той же строке кода: Ошибка: ссылка на нестатический элементдолжно быть относительно определенного объекта.

Вы видите, где трюк?Спасибо и всего наилучшего.

1 Ответ

14 голосов
/ 03 апреля 2012

Из официальной документации :

QtConcurrent :: run () также принимает указатели на функции-члены.Первый аргумент должен быть либо константной ссылкой, либо указателем на экземпляр класса.Передача по константной ссылке полезна при вызове константных функций-членов;передача по указателю полезна для вызова неконстантных функций-членов, которые изменяют экземпляр.

Вы можете указатель на указатель.Также обратите внимание, что вы не можете передавать аргументы так, как вы это делаете, но как дополнительные аргументы в функции run.Должно работать следующее:

futureComput = QtConcurrent::run(this->myMgr,&Manager::compute, model);
...