2016-08-05 32 views
1

Von dem, was ich nachgeschlagen habe, ist meine Syntax korrekt, aber mein Compiler (VS2015) beschweren sich. Hinweis: Ich verwende Namespace ee mit der Klasse Netzwerk. Hier ist der CodeC++ 11 - Übergabe Member-Funktion zu Thread gibt: keine überladene Funktion benötigt 2 Argumente

//code that doens't work 
    thread clientThread(&ee::Network::clientRun, new ee::Network); 

* Anmerkung: in dem realen Code, den ich nicht neu als Argument nennen, ich habe es hier Code zu verkürzen.

Ich habe die Funktionen getestet und sie funktionieren, ich kann sie nur nicht mit Thread arbeiten. Hier sind ihre Unterschriften.

void serverRun(); 
    void clientRun(); 
    void clientRun(string ip); 

Meine Fehler sind:

  1. Fehler C2661 'std :: thread :: thread': keine überladene Funktion nimmt zwei Argumente

  2. abc keine Instanz von Konstruktor „std :: Gewinde :: thread“entspricht der Argumentliste

jemand einen Einblick, Hat was happeni sein könnte ng in dieser Situation?

+1

Vielleicht nicht so dumme Frage, enthalten Sie '' , nicht wahr? Wir haben hier nicht viel zu tun. – WhozCraig

+1

Das sieht wie ein Visual C++ - Fehlercode aus - welche Version verwenden Sie? –

+3

Außerdem haben Sie ein Mehrdeutigkeitsproblem. Versuchen Sie 'void (ee :: Netzwerk :: * threadProc)() = & ee :: Netzwerk :: clientRun; thread clientThread (threadProc, new ee :: Netzwerk); ' –

Antwort

3

Bens Vorschlag behoben mein Problem, aber ich bin mir nicht sicher warum.

Das Problem ist, mit dem ersten Argument &ee::Network::clientRun. clientRun hat 2 Überladungen, aber zum Zeitpunkt der Schablonenreduktion (um die Typen der Argumente auf std::thread::thread<> abzuleiten) ist der Compiler noch nicht in der Lage zu unterscheiden, welche der Überlastungen gültiger ist.

Bens Lösung gearbeitet, weil die Besetzung vor dem Aufruf der Arbeit der Compiler getan hat für sie - durch die Art der Network::clientRun Angabe void (ee::Network*)(string)void (ee::Network*)(void) eher als die gleichermaßen gültig zu sein.

Einige Beispiele:

#include <thread> 
#include <string> 

struct Network 
{ 
    void clientRun(); 
    void clientRun(std::string); 
}; 

int main() 
{ 
    // not ok... 
// std::thread clientThread(&Network::clientRun, new Network); 

    // ok - tells the compiler which overload 
    auto member_function = static_cast<void (Network::*)()>(&Network::clientRun); 
    std::thread clientThreadA(member_function, new Network); 

    // also ok 
    using call_type = void (Network::*)(); 
    std::thread clientThreadB(call_type(&Network::clientRun), new Network); 
}