Kyl*_*ick 6 c++ multithreading default-parameters c++11
所以我有gcc版本4.8.1,g ++版本4.6.4,使用标志:-std = c ++ 0x和-pthread.
我将问题简化为显示的代码并仍然得到原始错误.
我在下面编译,但当我取消注释线程"两"的两行时,我得到代码下面显示的错误消息
#include <iostream>
#include <thread>
using namespace std;
void print_int(int x=7);
void print_A(){
cout << "A\n";
}
int main(){
thread one (print_int,17);
//thread two (print_int);
thread three (print_A);
one.join();
//two.join();
three.join();
return 0;
}
void print_int(int x){
cout << x << '\n';
}
Run Code Online (Sandbox Code Playgroud)
我试图解析错误消息,但我仍然不知道发生了什么......
In file included from /usr/include/c++/4.6/thread:39:0,
from def_params.cpp:2:
/usr/include/c++/4.6/functional: In member function ‘void std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__call(std::tuple<_Args ...>&&, std::_Index_tuple<_Indexes ...>, typename std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__enable_if_void<_Res>::type) [with _Res = void, _Args = {}, int ..._Indexes = {}, _Result = void, _Functor = void (*)(int), _Bound_args = {}, typename std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__enable_if_void<_Res>::type = int]’:
/usr/include/c++/4.6/functional:1378:24: instantiated from ‘std::_Bind_result<_Result, _Functor(_Bound_args ...)>::result_type std::_Bind_result<_Result, _Functor(_Bound_args ...)>::operator()(_Args&& ...) [with _Args = {}, _Result = void, _Functor = void (*)(int), _Bound_args = {}, std::_Bind_result<_Result, _Functor(_Bound_args ...)>::result_type = void]’
/usr/include/c++/4.6/thread:117:13: instantiated from ‘void std::thread::_Impl<_Callable>::_M_run() [with _Callable = std::_Bind_result<void, void (*())(int)>]’
def_params.cpp:26:9: instantiated from here
/usr/include/c++/4.6/functional:1287:4: error: too few arguments to function
Run Code Online (Sandbox Code Playgroud)
任何建议或解决方案?提前致谢!
Jon*_*ely 13
thread two (print_int);
Run Code Online (Sandbox Code Playgroud)
你不能这样做,C++中的默认参数仅用于调用站点(例如,当你print_int()
自己调用时)作为语法快捷方式,但是在例如std::thread
调用作为参数传递给它的相同函数时不使用.问题是std::thread
获得一个指向单参数函数的指针,但是没有传递参数来使用它,所以它不知道如何调用它,并且在给定指针的情况下无法查找函数的默认参数到功能.
最简单的解决方案是使用lambda来调用函数,因为该调用可以使用默认参数:
thread two( []{ print_int(); } );
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1402 次 |
最近记录: |