2012-04-05 5 views
9

Ich verwende die neue libcxx-Bibliothek, und ich habe einen Code, der die Socket-Funktion bind() aufruft. Das Problem ist, dass, wenn ich using namespace std; Typen der Compiler mir einen Fehler für den folgenden Code gibt:Kompilieren von Code, der die Socket-Funktion bind() mit libcxx verwendet, schlägt fehl

int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr)); 

Den Fehler mit Klirren (SVN build):

error: no viable conversion from '__bind<int &, sockaddr *, unsigned long>' to 'int' 
int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr)); 

Ich denke, dass das Problem ist, dass using namespace std; bringt die Funktion std::bind() aus dem Header <functional> in den Bereich (obwohl der Header nicht enthalten ist). Da ich eine Bibliothek eines Drittanbieters verwende, die den gesamten Namespace std verwendet, kann ich die Klassennamen nicht leicht in vollqualifizierte Namen ändern.

Ich frage mich, ob dies ein Problem bei der Implementierung der Bibliothek ist oder ob es einige neue Regeln in C++ 11 gibt, die möglicherweise einen alten Code, der bind() verwendet, brechen könnte. Irgendwelche Gedanken dazu würden geschätzt.

Dank

Roman

+0

Was meinen Sie, wenn Sie sagen, dass die Third-Party-Bibliothek den gesamten Namespace-Standard verwendet? – Troubadour

+0

Ich meine, dass es 'using namespace std;' in einigen der Dateien hat. –

+0

Vermutlich nur in den Quelldateien und nicht in den Headern? Das sollte dich überhaupt nicht beeinflussen. – Troubadour

Antwort

27

Dies ist kein Problem bei der Umsetzung der Bibliotheken. C++ 11 führte seine eigene std::bind Funktion in namespace std ein, die verwendet wird, um Parameter an Funktionen zu binden und ein bisschen Programmierung höherer Ordnung zu unterstützen.

Der Grund für namespace std ist, zu verhindern, dass neue Bibliotheksfunktionen und -klassen zu Änderungen im vorhandenen Code führen. Der Grund dafür ist, dass alles einen Namen hat, der mit std:: beginnt, was Namenskollisionen verhindert.

Wenn Sie jedoch using namespace std; in Ihrem Programm schreiben, werden Sie sich auf mögliche Bruch Änderungen wie diese auszusetzen, da die freie Funktion bind und die Funktion std::bind nicht unbedingt eindeutig gemacht werden kann.

Um dies zu beheben, können Sie bind als ::bind aufrufen, um zu verdeutlichen, dass es im globalen Namespace ist, oder Sie können die using namespace std; an der Spitze des Programms entfernen.

Hoffe, das hilft!

+0

Vielen Dank .. es funktioniert super !! – RajibTheKing

+1

Endlich verstand ich was los ist mit bind nicht int zurück. – viktike