Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程std::调用未知类型,未能专门化函数错误_C++_Multithreading - Fatal编程技术网

C++ 线程std::调用未知类型,未能专门化函数错误

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

我尝试在函数中使用thread at并将参数作为指针类发送,我接受的错误是
错误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您的问题解决了吗?您接受了答案吗?是的,您的帖子是我的答案。