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

7 c++ namespaces std winsock

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

Jon*_*ter 20

您可以更改要用于::bind()指定全局命名空间的调用.


Jon*_*ely 9

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

问题是socket bind()函数有这个签名:
int bind(int, const sockaddr*, socklen_t);
所以使用非const指针的示例中的调用发现可变参数模板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.