2015-03-04 3 views
1

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

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". Вот код ошибки: «ошибка C2280: » std :: packaged_task :: packaged_task (const std :: packaged_task &) ': попытка ссылки на удаленную функцию ... см. Объявление' std :: packaged_task :: packaged_task '... при компиляции функции-члена шаблона класса' void std :: allocator < _Ty> :: construct (_Ty *, const _Ty &) ' 1> с 1> [ 1> _Ty = std :: packaged_task "

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

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; 
} 
+1

Можете ли вы разместить текст ошибки вместо номера ошибки? – PaulMcKenzie

ответ

4

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

task_q.push_back(std::move(t)); 
+0

Итак, вы говорите, что сообщение об ошибке должно или могло читать «пытаться ссылаться на удаленную функцию», где функция является «конструктором копирования»? Где/как удалить ttor ctor? – rtischer8277

+0

@ rtischer8277, Да. [Документация 'std :: packaged_task'] (http://en.cppreference.com/w/cpp/thread/packaged_task/packaged_task) показывает, что конструктор копирования удален. –

+0

ссылка на документацию, объясняющую, что не было копии, помогло мне значительно понять. Есть, однако, еще одна проблема. Код до сих пор не компилируется, если я не верну свое значение вместо void. Я понял это, используя пробную ошибку n, но это где-то описано в справочном материале? – rtischer8277

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