C++ 线程std::调用未知类型,未能专门化函数错误
我尝试在函数中使用thread at并将参数作为指针类发送,我接受的错误是C++ 线程std::调用未知类型,未能专门化函数错误,c++,multithreading,C++,Multithreading,我尝试在函数中使用thread at并将参数作为指针类发送,我接受的错误是错误C2672'std::invoke':未找到匹配的重载函数,并且错误C2893未能专门化函数模板“未知类型std::invoke(_Callable&,_Types&&&…)noexcept()” 我搜索了很多,但只有我发现关于这个错误,每个人都忘记发送参数。我没有忘记,但我仍然有这些错误 我的功能如下 函数监听 void Listen(can* _c) { while (_c->s != INVALID_SOC
错误C2672'std::invoke':未找到匹配的重载函数
,并且错误C2893未能专门化函数模板“未知类型std::invoke(_Callable&,_Types&&&…)noexcept()”
我搜索了很多,但只有我发现关于这个错误,每个人都忘记发送参数。我没有忘记,但我仍然有这些错误
我的功能如下
函数监听
void Listen(can* _c) {
while (_c->s != INVALID_SOCKET)
{
auto t = thread( &connect_tcp::Recv_data,_c->connection, _c->s,ref(_c->response), _c->signals ); //ERROR IS HERE
t.join();
}
}
班机
class can {
public:
Cotp_connection cotp;
mms mms_obj;
connect_tcp* connection;
mms_response response;
LinkedList** list;
all_size_encoder size_encoder;
SOCKET s;
Signals* signals;
};
类连接\u tcp
class connect_tcp
{
public:
SOCKET ConnectWithTcp();
int send_data(SOCKET s, LinkedList** list,int &j);
connect_tcp();
connect_tcp(char* ip, int set_port);
void Close_tcp(SOCKET s);
void Recv_data(SOCKET s,mms_response &response, Signals *signals);
std::mutex mutex;
private:
SOCKET server;
SOCKADDR_IN addr;
int port;
WSADATA WSAData;
};
函数记录数据
void connect_tcp::Recv_data(SOCKET s,mms_response &response,Signals *signals) {
LinkedList** list = new LinkedList * [1000];
uint8_t* buffer = new uint8_t [10000];
Sleep(1000);
std::lock_guard<std::mutex>guard(mutex);
recv(s, (char*)buffer, 10000, 0);
/*this->mutex.unlock();*/
decode_bytes(response,buffer, list,signals);
}
std::thread
的第一个参数是一个可调用对象,其定义如下:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
(calleeObject->*fp)()
但在您的示例中,您将传递一个成员函数指针,指向std::thread
的构造,调用成员函数指针的正确语法如下所示:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
(calleeObject->*fp)()
因此,不能将成员函数指针传递给std::thread
的构造函数。解决此问题的简单方法是使用lambda作为可调用对象:
std::thread([=_c]()
{
_c->connection->Recv_data(_c->s, ref(_c->response), _c->signals);
});
或者,您也可以使用std::mem\u fn
适配器,将被调用对象也包括在参数列表中,就像您在自己的代码中所做的那样:
std::thread(std::mem_fn(&connect_tcp::Recv_data), _c->connection, _c->s, ref(_c->response), _c->signals);
如果是``std::thread([=\u c]()``````,我仍然会得到与``显式捕获匹配默认值``相同的错误。请不要使用显式捕获[=\u c]而使用默认捕获[=]。抱歉,按值捕获的正确语法是[\u c]。“此可调用对象必须使用以下语法进行调用:
f()
”-hmm,…@SerhanErkovan显然这不是Fureeish所说的正确答案。错误消息与代码不匹配。(错误消息提到int(\uu cdecl&)(SOCKET,int)
,我在发布的代码片段中找不到。)可能它提到了Recv_数据函数。我编辑了我的问题,想添加Recv_数据函数。但它不返回int。@CPlearner我想编译器会将我的套接字视为u int64您的问题解决了吗?您接受了答案吗?是的,您的帖子是我的答案。