2017-05-20 1 views
1

ich diesen Fehler habe:Fehler C2064: Ausdruck ergibt keine Funktion unter 1 Argumente - etwas über Themen

error C2064: term does not evaluate to a function taking 1 arguments 

Ich weiß nicht, warum, aber ich fand, dass seine etwas über die Fäden (wenn ich Kommentiere die Zeilen über die Threads, die kompiliert werden). das Problem ist in den Zeilen:

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

und:

thread t(&TriviaServer::clientHandler, client_socket); 

aus den Funktionen dienen() und acceptClient.

mein Code:

#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 
} 

Ist jemand wissen, der Grund und wie man es beheben?

Antwort

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

Da &TriviaServer::clientHandler ist definiert als:

TriviaServer::clientHandler(SOCKET); 

Das erste Argument für einen Anruf über die Funktionszeiger übergeben werden&TriviaServer::clientHandler sind ein impliziten this Parameter des Typs TriviaServer oder ein Zeiger auf einem Objekt von TriviaServer. Sie müssen das vor jedem anderen Argument der Funktionsdeklaration übergeben. So wollen Sie tun:

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

Ja, ich verstand den Grund und jetzt funktioniert es. Vielen Dank! – saar

Verwandte Themen