нажатие упакованной задачи в контейнер вызывает ошибку C2280 в VS2013

Я хочу использовать packaged_tasks для добавления задач в контейнер. Я создаю задачу, привязываю ее к номеру и пытаюсь запихнуть в свою деку. Я получаю ошибку компилятора C2280 (VS2013) на push_back. Вот код:

void DoTask( int i )
{
  std::cout << "int value: " << i << std::endl;
}

std::deque< std::packaged_task< void() > > task_q;

int _tmain(int argc, _TCHAR* argv[])
{
  std::packaged_task< void() > t( std::bind( DoTask, 3 ) );
  task_q.push_back( t ); // <-- C2280 error

  return 0;
}

Я получил этот пример кода из лекции Бо Цяня на YouTube под названием C++ Threading #9: packaged_task. Вот некоторый текст кода ошибки:

error C2280: 
    'std::packaged_task<void (void)>::packaged_task(const std::packaged_task<void (void)> &)' : attempting to reference a deleted function... see declaration of 'std::packaged_task<void (void)>::packaged_task'...while compiling class template member function 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)'
    1>          with
    1>          [
    1>              _Ty=std::packaged_task<void (void)>"

Вот код после двух исправлений (переместить задачу и непустое возвращаемое значение):

int DoTask( int i ) // non-void return value
{
  return i;
}

std::deque< std::packaged_task< int() > > task_q; // bind eliminates need for arg (Bo Qian lecture)

int _tmain( int argc, _TCHAR* argv[] )
{
  std::packaged_task< int() > t( std::bind( DoTask, 3 ) ); // bind eliminates need for arg
  task_q.push_back( std::move( t ) ); // <-- move not copy

  return 0;
}

person rtischer8277    schedule 04.03.2015    source источник
comment
Не могли бы вы опубликовать текст ошибки, а не только номер ошибки?   -  person PaulMcKenzie    schedule 04.03.2015


Ответы (1)


Конструктор копирования packaged_task удален. Использовать:

task_q.push_back( std::move(t) );
person R Sahu    schedule 04.03.2015
comment
Итак, вы говорите, что сообщение об ошибке должно или может читаться как «попытка сослаться на удаленную функцию», где функция является «конструктором копирования»? Где и как удаляется копия ctor? - person rtischer8277; 05.03.2015
comment
@ rtischer8277, Да. В документации std::packaged_task показано, что конструктор копирования удален. - person R Sahu; 05.03.2015
comment
ссылка на документацию, объясняющую, что не было копировального центра, значительно помогла моему пониманию. Однако есть еще одна проблема. Код по-прежнему не компилируется, если я не верну значение вместо void. Я понял это с помощью проб и ошибок, но задокументировано ли это где-нибудь в справочном материале? - person rtischer8277; 05.03.2015
comment
@ rtischer8277, рад, что смог вам помочь. - person R Sahu; 05.03.2015
comment
Возможно, вся идея packaged_task состоит в том, чтобы вернуть будущее, и не имеет смысла не возвращать значение. В любом случае, просто не запрашивать будущее, но все же возвращать значение, кажется, работает. Для ничего не подозревающих была бы полезна лучшая ошибка компилятора, отличная от C2182 (: '_Get_value' : незаконное использование типа 'void'). - person rtischer8277; 05.03.2015