rti*_*277 1 c++ concurrent.futures
我想使用packaged_tasks将任务添加到容器中。我创建一个任务,将其绑定到一个数字,然后尝试将其放入双端队列。我在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;
}
Run Code Online (Sandbox Code Playgroud)
我是从YouTube博前的讲座“ C ++线程#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> with 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;
}
Run Code Online (Sandbox Code Playgroud)
的复制构造函数packaged_task已删除。使用:
task_q.push_back( std::move(t) );
Run Code Online (Sandbox Code Playgroud)