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
risposta
È possibile modificare le chiamate per utilizzare lo ::bind()
per specificare lo spazio dei nomi globale.
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
.
+ 1 per spiegare perché. –
Gli spazi dei nomi sono divertenti, vero? –
No, basta rimuoverlo. – inf
Rimuovi 'using namespace std', altrimenti avremo lo stesso problema in futuro con qualche altro nome. – juanchopanza