我正在研究一个非常大的项目,在一个文件中我们突然遇到编译时错误,编译器似乎认为我们对winsock.h bind()
的调用实际上是对它的调用std::bind()
.似乎在包含文件中的某处有using namespace std
代码片段.我们可以尝试找到它们using namespace std
的使用位置并将其删除,但也许有更好的方法可以做到这一点?
是的,这很不幸.正如我在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
.
归档时间: |
|
查看次数: |
4211 次 |
最近记录: |