C++ 错误C2064:术语不计算为带1个参数的函数-与线程有关

C++ 错误C2064:术语不计算为带1个参数的函数-与线程有关,c++,multithreading,client-server,C++,Multithreading,Client Server,我得到了这个错误: error C2064: term does not evaluate to a function taking 1 arguments 我不知道为什么,但我发现这与线程有关(如果我注释掉它编译的线程的行)。 问题在于: thread t(&TriviaServer::clientHandler, this->_socket); 以及: 从函数serve()和acceptClient 我的代码: #include "TriviaServer.h" #def

我得到了这个错误:

error C2064: term does not evaluate to a function taking 1 arguments
我不知道为什么,但我发现这与线程有关(如果我注释掉它编译的线程的行)。 问题在于:

thread t(&TriviaServer::clientHandler, this->_socket);
以及:

从函数serve()和acceptClient

我的代码:

#include "TriviaServer.h"

#define PORT 8820
#define IFACE 0


TriviaServer::TriviaServer()
{
    this->_db = DataBase();
    this->_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (this->_socket == INVALID_SOCKET)
        throw exception(__FUNCTION__ " - socket");
}

TriviaServer::~TriviaServer()
{
    for (unsigned int i = 0; i < this->_connectedUsers.size(); i++)
        delete this->_connectedUsers[i];
    this->_connectedUsers.clear();
    for (unsigned int i = 0; i < this->_roomList.size(); i++)
        delete this->_roomList[i];
    this->_roomList.clear();
    TRACE(__FUNCTION__ " closing accepting socket");
    try
    {
        closesocket(this->_socket);
    }
    catch (exception e)
    {
        cout << e.what() << endl;
    }
    catch (...) {}
}

void TriviaServer::serve()
{
    bindAndListen();

    thread t(&TriviaServer::clientHandler, this->_socket);
    t.detach();

    while (true)
    {
        TRACE("accepting client...");
        acceptClient();
    }
}

void TriviaServer::bindAndListen()
{
    struct sockaddr_in sockAddr = { 0 };
    sockAddr.sin_port = PORT;
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_addr.s_addr = IFACE;

    if (::bind(this->_socket, (struct sockaddr*)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR)
        throw exception(__FUNCTION__ " - bind");
    TRACE("binded");

    if (::listen(this->_socket, SOMAXCONN) == SOCKET_ERROR)
        throw exception(__FUNCTION__ " - listen");
    TRACE("listening...");
}

void TriviaServer::acceptClient()
{
    SOCKET client_socket = accept(this->_socket, NULL, NULL);
    if (client_socket == INVALID_SOCKET)
        throw exception(__FUNCTION__);

    TRACE("Client accepted !");

    thread t(&TriviaServer::clientHandler, client_socket);
    t.detach();
}

void TriviaServer::clientHandler(SOCKET)
{
    //TODO
}
#包括“TriviaServer.h”
#定义端口8820
#定义IFACE 0
TriviaServer::TriviaServer()
{
这个->_db=DataBase();
此->\u socket=socket(AF\u INET、SOCK\u STREAM、IPPROTO\u TCP);
if(this->\u socket==无效的\u socket)
抛出异常(_函数__“-socket”);
}
TriviaServer::~TriviaServer()
{
for(unsigned int i=0;i_connectedUsers.size();i++)
删除此->_connectedUsers[i];
此->_connectedUsers.clear();
for(unsigned int i=0;i_roomList.size();i++)
删除此->_房间列表[i];
此->\u roomList.clear();
跟踪(_函数__“关闭接受套接字”);
尝试
{
闭合插座(此->U插座);
}
捕获(例外e)
{
cout _socket,(struct sockaddr*)&sockaddr,sizeof(sockaddr))==socket\u错误)
抛出异常(_函数__“-bind”);
痕迹(“绑定”);
if(::侦听(此->\u套接字,SOMAXCONN)=套接字\u错误)
抛出异常(_函数__“-listen”);
跟踪(“倾听…”);
}
void TriviaServer::acceptClient()
{
SOCKET client_SOCKET=accept(此->_SOCKET,NULL,NULL);
if(客户端\u套接字==无效的\u套接字)
抛出异常(函数);
跟踪(“客户已接受!”);
线程t(&TriviaServer::clientHandler,客户端_套接字);
t、 分离();
}
void TriviaServer::clientHandler(套接字)
{
//待办事项
}
有人知道原因以及如何解决吗

thread t(&TriviaServer::clientHandler, this->_socket);
由于TriviaServer::clientHandler被定义为:

TriviaServer::clientHandler(SOCKET);
通过函数指针
&TriviaServer::clientHandler
传递给调用的第一个参数是
TriviaServer
类型的隐式
参数,或指向
TriviaServer
对象的指针。您需要在函数声明接受任何其他参数之前传递该参数。因此,您要执行以下操作:

thread t(&TriviaServer::clientHandler, this, this->_socket);

是的,我明白了原因,现在它起作用了。谢谢!
thread t(&TriviaServer::clientHandler, this, this->_socket);