Multithreading 将另一个成员函数和var传递给std::thread的成员函数

Multithreading 将另一个成员函数和var传递给std::thread的成员函数,multithreading,c++11,winsock,Multithreading,C++11,Winsock,我一直在寻找解决方案,但在尝试了大约10种方法后,我无法解决我的编译问题: functional(1149): error C2064: term does not evaluate to a function taking 2 arguments 这是我代码的一部分 pConnectedClients.push_back(new RemoteClient(hClientSocket, RemoteClientNumber)); if (pConnectedClients.size() &g

我一直在寻找解决方案,但在尝试了大约10种方法后,我无法解决我的编译问题:

 functional(1149): error C2064: term does not evaluate to a function taking 2 arguments
这是我代码的一部分

pConnectedClients.push_back(new RemoteClient(hClientSocket, RemoteClientNumber));
if (pConnectedClients.size() > 1)
{
    for (int unsigned i = 0; i < pConnectedClients.size(); i++)
    {
        if (RemoteClientRec == pConnectedClients[i]->GetNumber())
        {
            SOCKET tmp = pConnectedClients[i]->GetSocket();
            std::thread MessageThread(&cRunServer::HandleConnection, hClientSocket, &cRunServer::pConnectedClients[i]);
            MessageThread.join();
        }
    }
}
编辑

更多背景:

class cRunServer : public RemoteClient {
public:
    cRunServer();
    ~cRunServer();
    void RunServer();
    void Listen(SOCKET &listeningSocket);
    void HandleConnection(SOCKET hClientSocket, SOCKET hClientSocket2);

protected:
    // Variables
    void BindAndCreate(SOCKET &listeningSocket);
    SOCKET hListeningSocket = INVALID_SOCKET;
    sockaddr_in sockAddr;
    std::vector<RemoteClient *> pConnectedClients;
    // Dane remote clienta
    // Nr clienta
    int RemoteClientNumber = 0;
    // Nr odbiorcy
    int RemoteClientRec = 0;

    // Funkcja laczy ze soba dwoch klientow

    std::string GetHostDescription(const sockaddr_in &sockAddr);
    void SetServerSockAddr(sockaddr_in *pSockAddr, int portNumber);
    void HandleMessaging(SOCKET hClientSocket, SOCKET hClientSocket2);
    void GetClientInfo(SOCKET &s);
};

// somewhere in `cRunServer::RunServer()`:  

try {
    int iResult;
    Listen(hListeningSocket);
    // Akceptujemy polaczenie
    // rzutowanie konieczne, aby moc wpisac strukture sockadrr_in do struktury sockaddr
    // Przechowywanie adresu zdalnego hosta jest opcjonalne! #wow
    hClientSocket = accept(hListeningSocket, 0, 0); //, reinterpret_cast<sockaddr*>(&clientSockAddr),&clientSockSize);
    // Sprawdzamy bledy
    if (hClientSocket == INVALID_SOCKET)
        throw Exception("accept function failed.");
    std::cout << "accepted.\n";
    GetClientInfo(hClientSocket);
    pConnectedClients.push_back(new RemoteClient(hClientSocket, RemoteClientNumber));
    if (pConnectedClients.size() > 1) {
        for (int unsigned i = 0; i < pConnectedClients.size(); i++) {
            if (RemoteClientRec == pConnectedClients[i]->GetNumber()) {
                std::thread MessageThread(&cRunServer::HandleConnection, this, hClientSocket,
                                        &cRunServer::pConnectedClients[i]);
            }
        }
    }
}

catch (Exception e)
std::threadmessagethread&cRunServer::HandleConnection,hClientSocket,&cRunServer::pConnectedClients[i]

我猜HandleConnection是cRunServer的非静态成员函数,而hClientSocket不是cRunServer所需的对象

加上:

std::thread MessageThread(&cRunServer::HandleConnection, 
          this,
          hClientSocket, 
          &cRunServer::pConnectedClients[i]);
假设这是一个cRunServer*


cRunServer::HandleConnection的声明是什么?hClientSocket的类型是什么?有点讽刺的是,在添加了所有代码之后,您仍然忽略了解释cRunServer实例来源的部分,我们只能/猜测/try块是否在该类的成员函数中…我的错,抱歉。它是void cRunServer::RunServer成员函数。所有函数都是CRunServer或RemoteClient的成员class@reybanger你在说什么?这证实了我确实是对的。HandleConnection有两个套接字作为参数:void HandleConnectionSOCKET hClientSocket,SOCKET hClientSocket2;对不起,我是新手,我不能很好地格式化commants,请给我一秒钟:@reybanger没有人能很好地格式化评论,因为这不是它们的用途。密码进入了这个问题。但是,您不需要在注释中发布代码。说/问你想说什么/ask@reybanger关键是,所有非静态成员函数都具有隐式this参数。使用bind时,必须将其作为第一个参数显式传递。
std::thread MessageThread(&cRunServer::HandleConnection, 
          this,
          hClientSocket, 
          &cRunServer::pConnectedClients[i]);