Следуя этому отличному руководству для Futures , promises и пакетных задач Я дошел до того момента, когда я хотел подготовить свою собственную задачу
#include
#include
using namespace std;
int ackermann(int m, int n) { // might take a while
if(m==0) return n+1;
if(n==0) return ackermann(m-1,1);
return ackermann(m-1, ackermann(m, n-1));
}
int main () {
packaged_task task1 { &ackermann, 3, 11 }; // <- error
auto f1 = task1.get_future();
thread th1 { move(task1) }; // call
cout << " ack(3,11):" << f1.get() << endl;
th1.join();
}
Насколько я могу расшифровать сообщение об ошибке gcc-4.7.0, оно по-другому ожидает аргументы? Но как? Я пытаюсь сократить сообщение об ошибке:
error: no matching function for call to
'std::packaged_task::packaged_task()'
note: candidates are:
std::packaged_task<_Res(_ArgTypes ...)>::---<_Res(_ArgTypes ...)>&&) ---
note: candidate expects 1 argument, 3 provided
...
note: cannot convert 'ackermann'
(type 'int (*)(int, int)') to type 'std::allocator_arg_t'
Неправильный ли мой вариант, как я предоставляю параметры для ackermann
? Или это неправильный параметр шаблона? Я не передаю параметры 3,11
для создания треда, верно?
Обновление другие неудачные варианты:
packaged_task task1 ( []{return ackermann(3,11);} );
thread th1 { move(task1) };
packaged_task task1 ( bind(&ackermann,3,11) );
thread th1 { move(task1) };
packaged_task task1 ( &ackermann );
thread th1 { move(task1), 3,11 };
хм ... это я, или это бета -gcc?