2012-04-05 7 views
9

Sto usando la nuova libreria libcxx e ho un codice che chiama la funzione socket bind(). Il problema è che quando digito using namespace std; il compilatore mi dà un errore per il seguente codice:Codice di compilazione che utilizza la funzione socket bind() con libcxx fallisce

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

L'errore utilizzando clang (accumulo svn):

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

penso che il problema è che using namespace std; porta la funzione std::bind() dall'intestazione <functional> all'ambito (sebbene l'intestazione non sia inclusa). Poiché utilizzo una libreria di terze parti che utilizza l'intero spazio dei nomi std, non è possibile modificare facilmente i nomi delle classi con nomi completi.

Mi chiedevo se questo è un problema nell'implementazione della libreria o se ci sono alcune nuove regole in C++ 11 che potrebbero potenzialmente rompere un vecchio codice che utilizza bind(). Qualunque pensiero a questo proposito sarebbe apprezzato.

Grazie

romana

+0

Che cosa intendi quando dici che la libreria di terze parti utilizza l'intero spazio dei nomi std? – Troubadour

+0

Voglio dire che ha 'using namespace std;' in alcuni dei file. –

+0

Presumibilmente solo nei file di origine e non nelle intestazioni? Questo non dovrebbe influenzarti affatto. – Troubadour

risposta

27

Questo non è un problema per l'attuazione delle librerie. C++ 11 ha introdotto la propria funzione std::bind in namespace std, che viene utilizzata per associare i parametri alle funzioni e supportare un po 'di programmazione di ordine superiore.

La ragione per cui si dispone di namespace std è quella di impedire che nuove funzioni e classi di libreria causino la rottura delle modifiche nel codice esistente. Il motivo è che tutto ha un nome che inizia con std::, che impedisce le collisioni di nomi.

Tuttavia, se si scrive using namespace std; nel programma, si sta esporsi a potenziali cambiamenti di rottura come questo, dal momento che la funzione libera bind e la funzione std::bind non può necessariamente essere disambiguare.

Per risolvere questo problema, è possibile chiamare bind come ::bind per chiarire che si trova nello spazio dei nomi globale oppure è possibile rimuovere using namespace std; nella parte superiore del programma.

Spero che questo aiuti!

+0

Grazie mille .. funziona benissimo !! – RajibTheKing

+1

Finalmente ho capito cosa sta succedendo con bind che non restituisce int. – viktike

Problemi correlati