Я работаю над очень крупным проектом, и в одном файле мы все внезапно получили ошибку времени компиляции, когда компилятор, похоже, думает, что наш вызов winsock.h bind()
на самом деле является вызовом для std::bind()
. Кажется, что где-то в файле include есть using namespace std
фрагмент кода. Мы могли бы попытаться найти, где находятся эти using namespace std
, и удалить их, но, возможно, есть лучший способ сделать это?std :: bind и winsock.h bind confusion
ответ
Вы можете изменить свои вызовы, чтобы использовать ::bind()
, чтобы указать глобальное пространство имен.
Да, это несчастливо. Как я описал в http://gcc.gnu.org/ml/libstdc++/2011-03/msg00143.htmlstd::bind
шаблон лучше подходит, если вы не будете использовать именно те типы аргументов:
Проблема заключается в том, что функция сокета связывания() имеет эту подпись:
int bind(int, const sockaddr*, socklen_t);
поэтому вызов в пример с использованием указателя non-const обнаруживает, что вариационный шаблон std :: bind является лучшим совпадением. То же самое произойдет , если третий аргумент был любым целым типом, кроме socklen_t.
Ваш код будет работать с GCC, потому что я добавил соответствующее расширение к ССЗУ std::bind
, чтобы предотвратить эту неоднозначность, удаляя std::bind
от перегрузки, установленной, если первый аргумент «гнездо типа», который я определил с помощью is_integral
и is_enum
. Однако это не помогает с другими реализациями.
Удаление using namespace std;
является хорошей идеей, в любом случае, но не может быть вполне достаточно, потому что неквалифицированный вызов bind()
, что случается использовать тип, определенный в пространстве имен std
(такие, как std::size_t
) все еще может найти std::bind
от аргумента зависимого поиска. Ответ Джонатана Поттера - лучший способ обеспечить вам правильную функцию: квалифицируйте ее как ::bind
.
+ 1 для объяснения причин. – 2013-03-07 10:02:23
- 1. boost :: bind, std :: bind и перегруженные функции
- 2. std :: bind и std :: weak_ptr
- 3. Qt и std :: bind
- 4. Boost :: bind и std :: copy
- 5. Шаблоны Variadic и std :: bind
- 6. Использование std :: bind в std :: bind: ошибка компиляции (неявный листинг)
- 7. Понимание std :: function и std :: bind
- 8. странное поведение std :: bind
- 9. std :: bind связанная функция
- 10. Функторы против std :: bind
- 11. Разница между C++ 11 std :: bind и boost :: bind
- 12. Когда следует использовать std :: bind?
- 13. std :: bind null function pointer
- 14. Функция преобразования из std :: bind
- 15. Как можно использовать std :: bind?
- 16. std :: bind аргумент поведение копирования
- 17. std :: bind no жизнеспособное преобразование
- 18. std :: bind compiler error gcc
- 19. Передача rvalues через std :: bind
- 20. Как установить std :: bind templated?
- 21. std :: bind заголовочное объявление файла
- 22. Ошибка Clang с std :: function, std :: bind и std :: ref?
- 23. std :: bind-like функция возвращает std :: function
- 24. Confusion in bind call in socket programming
- 25. C++ 0x11 - std :: bind и состав
- 26. std :: bind и unique_ptr - как двигаться только?
- 27. Android bind bind text
- 28. do std :: function и std :: bind сделать динамическое выделение памяти?
- 29. Emscripten и преобразование из std :: bind to std :: function
- 30. перемещение семантики/поведения в std :: bind и std :: thread
пространства имен - это весело, не так ли? –
Нет, просто удалите его. – inf
Удалите 'using namespace std', иначе у вас будет такая же проблема в будущем с каким-то другим именем. – juanchopanza