2013-03-06 3 views
5

Я работаю над очень крупным проектом, и в одном файле мы все внезапно получили ошибку времени компиляции, когда компилятор, похоже, думает, что наш вызов winsock.h bind() на самом деле является вызовом для std::bind(). Кажется, что где-то в файле include есть using namespace std фрагмент кода. Мы могли бы попытаться найти, где находятся эти using namespace std, и удалить их, но, возможно, есть лучший способ сделать это?std :: bind и winsock.h bind confusion

+0

пространства имен - это весело, не так ли? –

+4

Нет, просто удалите его. – inf

+2

Удалите 'using namespace std', иначе у вас будет такая же проблема в будущем с каким-то другим именем. – juanchopanza

ответ

15

Вы можете изменить свои вызовы, чтобы использовать ::bind(), чтобы указать глобальное пространство имен.

7

Да, это несчастливо. Как я описал в 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.

+0

+ 1 для объяснения причин. – 2013-03-07 10:02:23

Смежные вопросы