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é. –
- 1. std :: bind to std :: function?
- 2. C++ std :: bind
- 3. Emulazione std :: bind in C
- 4. Informazioni su std :: function e std :: bind
- 5. Passa rvalues tramite std :: bind
- 6. std :: bind e spedizioni perfetto
- 7. std :: bind e riferimento rvalue
- 8. Passando da boost :: bind a std :: bind: errore
- 9. Differenza tra C++ 11 std :: bind e boost :: bind
- 10. Dovrei vedere differenze significative tra std :: bind e boost :: bind?
- 11. Legatura con coffeescript
- 12. Come combinare l'uso di std :: bind con std :: shared_ptr
- 13. laravel: Legatura di IoC Container
- 14. Knockout.js: Legatura per oggetto complesso
- 15. Come si può usare std :: bind?
- 16. la confusione su come utilizzare std :: meno e std :: maggiore con std :: sort
- 17. Guice: Legatura diversi oggetti con diverse dipendenze
- 18. Modello WebAPI Legatura da JSON
- 19. Confusione sulle espressioni costanti
- 20. Come utilizzare le funzioni lambda con boost :: bind/std :: bind in VC++ 2010?
- 21. std :: bind a una std :: function si arresta in modo anomalo con Clang
- 22. È std :: bind ancora utile rispetto a lambda?
- 23. std :: bind non ha senso per me qualunque
- 24. Se std :: bind è compatibile con boost :: asio?
- 25. Come combinare std :: bind(), modelli variadic e inoltro perfetto?
- 26. Esiste un equivalente di std :: bind in javascript o node.js?
- 27. Cosa diavolo fa std :: bind (x, y) do?
- 28. È sicuro usare std :: bind con boost :: signals2?
- 29. Perché std :: bind account per la funzione arity?
- 30. confusione vincolo valore in C++
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