我正在处理一个非常大的项目,在一个文件中,我们突然遇到一个编译时错误,编译器似乎认为我们对 winsock.hbind()
的调用实际上是对std::bind()
. 似乎包含文件中的某处有using namespace std
代码片段。我们可以尝试找到它们using namespace std
在哪里使用并删除它们,但也许有更好的方法来做到这一点?
2 回答
您可以更改::bind()
用于指定全局命名空间的调用。
是的,这很不幸。正如我在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_integral
is_enum
无论如何,删除using namespace std;
是一个好主意,但可能并不完全足够,因为对它的非限定调用bind()
恰好使用命名空间中定义的类型std
(例如std::size_t
)仍然可以std::bind
通过参数相关查找找到。乔纳森·波特的回答是确保您获得正确功能的最佳方式:将其限定为::bind
.