如何区分sys/sockets.h和std :: bind中的bind()?

Not*_*ggs 6 c++ g++

我正在使用g ++ 4.6.0来编译在早期版本中成功编译的一些C++代码.

if ( bind(iControl, (struct sockaddr *) &sa, sizeof(sa)) == -1)
  throw runtime_error ("bind");
Run Code Online (Sandbox Code Playgroud)

其中iControl是套接字,sa是a 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’
Run Code Online (Sandbox Code Playgroud)

comms.cpp:93:66:注意:候选人是:

接下来是大约一页半的候选人.

它似乎是将sys/sockets.hstd :: bind in中的bind函数混合在一起functional.如何在不重写我要移除的整个源文件的情况下消除歧义using namespace std

Mar*_*k B 18

使其符合全球要求:( ::bind(...)并确保包含所有正确的标题).

编辑:(我从@Bo Persson的评论中得到了这个想法)另一个可靠的选择是using namespace std;改为几个using <thing>:

using std::cout;
using std::endl;
using std::string;
// etc.
Run Code Online (Sandbox Code Playgroud)

这使您的旧代码可以编译,而不会std::bind进入全局命名空间.