8

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

4

2 回答 2

26

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

于 2013-03-06T22:12:06.340 回答
10

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

问题是套接字 bind() 函数具有这个签名:
int bind(int, const sockaddr*, socklen_t);
因此示例中使用非常量指针的调用发现可变参数模板 std::bind 是更好的匹配。如果第三个参数是除 socklen_t 之外的任何整数类型,也会发生同样的情况。

您的代码可以与 GCC 一起使用,因为我向 GCC 添加了一个符合标准的扩展来std::bind防止这种歧义,如果第一个参数是“socket-like”(我使用andstd::bind定义的),则从重载集中删除。不过,这对其他实现没有帮助。is_integralis_enum

无论如何,删除using namespace std;是一个好主意,但可能并不完全足够,因为对它的非限定调用bind()恰好使用命名空间中定义的类型std(例如std::size_t)仍然可以std::bind通过参数相关查找找到。乔纳森·波特的回答是确保您获得正确功能的最佳方式:将其限定为::bind.

于 2013-03-06T23:48:07.603 回答