我试图做这样的事情:
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:错误:'class std :: result_of'中没有名为'type'的类型 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 ...&GT) ^ ~~~~~~~~ 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);
}
一切都很完美。当我将参考作为参数传递给线程函数时,我做错了什么?
答案 0 :(得分:2)
所以这里有一个有效的例子:
#include <thread>
#include <functional>
class RPiServer;
void commands_conn_handler(int socket, RPiServer &server) {
// Not important code about handling connection
}
class RPiServer {
public:
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, std::ref(*this));
conn_handler_thread.join();
}
};
int main() {
RPiServer commands_server;
commands_server.Accept(commands_conn_handler);
}
您收到的错误是因为您没有为conn_handler_thread
的构造函数提供正确的类型。要显式获取对象的引用(您需要在此处执行),请使用std::ref()
函数。
P.S。:此外,您复制粘贴的代码示例错误,复制void Accept
部分。您在main()
中也遇到most vexing parse错误。