Как создать packaged_task с параметрами?

Следуя этому отличному руководству для 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?

8
задан Nathan Kleyn 8 November 2011 в 04:15
поделиться