Как различить bind () в sys / sockets.h и std :: bind? - PullRequest
6 голосов
/ 01 июля 2011

Я использую g ++ 4.6.0 для компиляции некоторого кода C ++, который успешно скомпилирован в более ранних версиях.

if ( bind(iControl, (struct sockaddr *) &sa, sizeof(sa)) == -1)
  throw runtime_error ("bind");

, где iControl - сокет, а sa - struct sockaddr_in.

Однако в g ++ 4.6 я получаю следующую ошибку:

comms.cpp:93:66: error: no match for ‘operator==’ in ‘std::bind(_Functor&&, _ArgTypes&& ...) [with _Functor = int&, _ArgTypes = {sockaddr*, long unsigned int}, typename std::_Bind_helper<_Functor, _ArgTypes>::type = std::_Bind<int(sockaddr*, long unsigned int)>]((* &((sockaddr*)(& sa))), (* &16ul)) == -0x00000000000000001’

comms.cpp: 93: 66: примечание: кандидаты:

, за которыми следуют примерно половина страницывозможные кандидаты.

Кажется, что она смешивает функцию связывания в sys/sockets.h с std :: bind в functional.Как устранить неоднозначность, не переписывая весь исходный файл, чтобы удалить using namespace std?

1 Ответ

18 голосов
/ 01 июля 2011

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

РЕДАКТИРОВАТЬ: (я понял из комментария @Bo Persson) Еще один надежный вариант - изменитьusing namespace std; до нескольких using <thing>, например:

using std::cout;
using std::endl;
using std::string;
// etc.

Это позволяет скомпилировать старый код и не выводить std::bind в глобальное пространство имен.

...