std :: bind和winsock.h绑定混淆

时间:2013-03-06 22:10:53

标签: c++ namespaces winsock std

我正在处理一个非常大的项目,在一个文件中我们突然遇到编译时错误,编译器似乎认为我们对winsock.h bind()的调用实际上是对std::bind()。似乎在包含文件中的某处有using namespace std代码段。我们可以尝试找到这些using namespace std正在使用的位置并删除它们,但也许有更好的方法可以做到这一点?

2 个答案:

答案 0 :(得分:20)

您可以更改调用以使用::bind()指定全局命名空间。

答案 1 :(得分:9)

是的,这很不幸。正如我在http://gcc.gnu.org/ml/libstdc++/2011-03/msg00143.html中所描述的那样,std::bind模板是更好的匹配,除非您使用正确的参数类型:

  

问题是socket bind()函数有这个签名:
  int bind(int, const sockaddr*, socklen_t);
  所以使用非const指针的示例中的调用发现了   variadic模板std :: bind是一个更好的匹配。同样会发生   如果第三个参数是除socklen_t之外的任何整数类型。

您的代码可以与GCC一起使用,因为我添加了符合GCC std::bind的扩展,以防止这种歧义,如果第一个参数是“套接字”,则从重载集中删除std::bind,我使用is_integralis_enum进行了定义。但这对其他实现没有帮助。

无论如何,删除using namespace std;是一个好主意,但可能不够完整,因为对bind()的无条件调用碰巧使用在命名空间std中定义的类型(例如std::size_t)仍然可以通过参数依赖查找找到std::bind。 Jonathan Potter的答案是确保您获得正确功能的最佳方式:将其限定为::bind