2013-03-06 16 views
5

Sto lavorando su un progetto molto grande e in un file abbiamo improvvisamente ottenuto un errore in fase di compilazione in cui il compilatore sembra pensare che la nostra chiamata a winsock.h bind() è in realtà una chiamata a std::bind(). Sembra che da qualche parte in un file include ci sia lo snippet di codice using namespace std. Potremmo provare e trovare dove sono in uso questi using namespace std e rimuoverli, ma forse c'è un modo migliore per farlo?std :: bind and winsock.h confusione legatura

+0

Gli spazi dei nomi sono divertenti, vero? –

+4

No, basta rimuoverlo. – inf

+2

Rimuovi 'using namespace std', altrimenti avremo lo stesso problema in futuro con qualche altro nome. – juanchopanza

risposta

15

È possibile modificare le chiamate per utilizzare lo ::bind() per specificare lo spazio dei nomi globale.

7

Sì, questo è sfortunato. Come ho descritto in http://gcc.gnu.org/ml/libstdc++/2011-03/msg00143.html il modello std::bind risulta più simile a meno che non si utilizza esattamente la giusta tipi di argomenti:

Il problema è che la funzione di presa bind() ha questa firma:
int bind(int, const sockaddr*, socklen_t);
così la chiamata in l'esempio che utilizza un puntatore non const scopre che il modello variadic std :: bind è una corrispondenza migliore. Lo stesso sarebbe accaduto se il terzo argomento era un tipo integrale tranne socklen_t.

Il codice funzionerebbe con GCC perché ho aggiunto un'estensione conforme al GCC di std::bind evitare questa ambiguità, rimuovendo std::bind dal sovraccarico impostato se il primo argomento è "presa-like", che ho definito utilizzando is_integral e is_enum. Questo però non aiuta con altre implementazioni.

Rimozione using namespace std; è comunque una buona idea, ma non può essere del tutto sufficiente, perché una chiamata qualificato a bind() che accade di utilizzare un tipo definito nel namespace std (come std::size_t) potrebbe ancora trovare std::bind dall'argomento ricerca dipendente. La risposta di Jonathan Potter è il modo migliore per assicurarti di ottenere la funzione giusta: qualificalo come ::bind.

+0

+ 1 per spiegare perché. –

Problemi correlati