我正在处理一个非常大的项目,在一个文件中我们突然遇到编译时错误,编译器似乎认为我们对winsock.h bind()
的调用实际上是对std::bind()
。似乎在包含文件中的某处有using namespace std
代码段。我们可以尝试找到这些using namespace std
正在使用的位置并删除它们,但也许有更好的方法可以做到这一点?
答案 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_integral
和is_enum
进行了定义。但这对其他实现没有帮助。
无论如何,删除using namespace std;
是一个好主意,但可能不够完整,因为对bind()
的无条件调用碰巧使用在命名空间std
中定义的类型(例如std::size_t
)仍然可以通过参数依赖查找找到std::bind
。 Jonathan Potter的答案是确保您获得正确功能的最佳方式:将其限定为::bind
。