这个问题在这里已有答案:
我正在尝试做这样的事情:
void commands_conn_handler(int socket, RPiServer& server) {
// Not important code about handling connection
}
class RPiServer {
public:
void Accept(void Accept(void (*acceped_conn_handler)(int, RPiServer&)) {
// (...)
int remote_socket = 0; // Doesn't matter - example.
std::thread conn_handler_thread(acceped_conn_handler, remote_socket, *this);
conn_handler_thread.join();
}
};
int main() {
RPiServer commands_server();
commands_server.Accept(commands_conn_handler);
}
当我尝试构建它时,有一些错误:
在/ usr / include / c / 6 / thread:39:0中包含的文件,来自src / rpi_server / rpiserver.cpp:11:/ usr / include / c / 6 / functional:在'struct std ::的实例化中_Bind_simple':/ usr / include / c / 6 / thread:138:26:'std :: thread :: thread(Callable &&, Args && ...)[with _Callable = void(*&)(int,RPiServer&) ; _Args = {int&,RPiServer&}]'src / rpi_server / rpiserver.cpp:89:79:从这里需要/ usr / include / c / 6 / functional:1365:61:错误:'类中没有名为'type'的类型std :: result_of'typedef typename result_of <Callable( Args ...)> :: type result_type; ^ ~~~~~~~~~~ / usr / include / c / 6 / functional:1386:9:错误:'class std :: result_of'中没有名为'type'的类型_M_invoke(_Index_tuple <_Indices ... >)^ ~~~~~~~~ Makefile:29:目标'build / rpi_server / rpiserver.o'的配方失败
当我以下列方式更改线程函数时(删除对象的引用):
void commands_conn_handler(int socket) {
// Not important code about handling connection
}
class RPiServer {
public:
void Accept(void (*acceped_conn_handler)(int)) {
// (...)
int remote_socket = 0; // Doesn't matter - example.
std::thread conn_handler_thread(acceped_conn_handler, remote_socket);
conn_handler_thread.join();
}
};
int main() {
RPiServer commands_server();
commands_server.Accept(commands_conn_handler);
}
一切都很完美 . 当我将参考作为参数传递给线程函数时,我做错了什么?
1 回答
所以这里有一个有效的例子:
您得到的错误是因为您没有为
conn_handler_thread
的构造函数提供正确的类型 . 要显式获取对象的引用(您需要在此处执行),请使用std::ref()函数 .P.S . :还复制粘贴你的代码示例错误,复制
void Accept
部分 . 您在main()
中也有most vexing parse错误 .