2013-03-06 14 views
5

Ich arbeite an einem sehr großen Projekt und in einer Datei haben wir plötzlich einen Kompilierfehler, wo der Compiler scheint, dass unser Aufruf an winsock.h bind() ist eigentlich ein Anruf an std::bind(). Es scheint, dass irgendwo in einer Include-Datei using namespace std Code-Snippet ist. Wir könnten versuchen zu finden, wo diese using namespace std sind und sie entfernen, aber vielleicht gibt es einen besseren Weg, dies zu tun?std :: bind und winsock.h Bind Verwirrung

+0

Namespaces sind Spaß, nicht wahr? –

+4

Nein, entfernen Sie es einfach. – inf

+2

Entfernen Sie 'using namespace std', sonst haben Sie das gleiche Problem irgendwann in der Zukunft mit einem anderen Namen. – juanchopanza

Antwort

15

Sie können Ihre Anrufe so ändern, dass ::bind() verwendet wird, um den globalen Namespace anzugeben.

7

Ja, das ist bedauerlich. Wie ich bei http://gcc.gnu.org/ml/libstdc++/2011-03/msg00143.html beschrieben die std::bind Vorlage ist eine bessere Übereinstimmung, wenn Sie genau die richtigen Argumenttypen verwenden:

Das Problem ist, dass die Buchse Funktion bind() diese Signatur hat:
int bind(int, const sockaddr*, socklen_t);
so den Anruf in Das Beispiel, das einen nichtkonstanten Zeiger verwendet, findet, dass die variadic Schablone std :: bind eine bessere Übereinstimmung ist. Dasselbe würde passieren, wenn das dritte Argument irgendein integraler Typ außer socklen_t wäre. wenn das erste Argument „socket-like“

Ihr Code mit GCC arbeiten würde, weil ich std::bind eine konforme Erweiterung GCC hinzugefügt, um diese Mehrdeutigkeit zu verhindern, indem std::bind von der Überlastung gesetzt entfernen, was ich mit is_integral definiert und is_enum. Das hilft jedoch bei anderen Implementierungen nicht.

die using namespace std; Entfernen ist eine gute Idee, wie auch immer, aber vielleicht nicht ganz ausreichend sein, weil ein voller Aufruf bind(), die einen Typen im Namensraum definiert zu verwenden, geschieht std (wie std::size_t) noch std::bind durch Argument abhängige Lookup finden konnte. Jonathan Potters Antwort ist der beste Weg, um sicherzustellen, dass Sie die richtige Funktion erhalten: qualifizieren Sie es als ::bind.

+0

+ 1 zur Erklärung warum. –