问题如下现象C++11 bind冲突:
VS2015编译错误:
errorCxxxx: ‘initializing’ : cannot convert from ‘std::_Bind<false,void,SOCKET&,sockaddr *,unsigned int>’ to ‘int’
现象:Socket编程中bind()函数出错
原因:c++ 11 ,在命名空间std中实现了bind函数,与socket编程里的bind函数冲突。
在网上找了几天给出的解决方案都是类似的:
解决方法: 去掉本文件的命名空间usingnamespace std;(如果还出错的话,一定是因为该文件包含的头文件,还存在std。)
注意:如果注释掉“usingnamespace std;”后报了更多错,请不要注释usingnamespace std;
而将bind()函数换成 ::bind();一直使用 ::bind(),::的用法是直接访问全局,也是系统调用 在网上看处理都是类似这样的
或
该函数是绑定Socket, 而在C++11中增加了std::bind(_Fp &&__f, _BoundArgs
&&__bound_args…) 函数, 可以用该函数绑定函数指针, 当在C++类中添加了using namespace
std;之后,如果你想调用socket.h中的bind方法则会出现问题, 使得bind函数调用不是你想要的行为。
解决方案是在使用socket.h的bind函数的类中不要使用using namespace std。
但我无论修改多少次都是一样,也是不行。
我也尝试过使用C++11特性的function试着突破它,如下:
std::function<int(SOCKET, const struct sockaddr *, int)> fr3 = std::bind(::bind, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
但最终还是不行。失败了!!!
但最后我使用一个函数指针解决了这一个问题,真的很神奇的解决了,- - 。
如果也有和我遇到同样的问题的,希望能帮到你。
解决方法:
增加一个函数指针
int
(WSAAPI * MyBind)(
_In_ SOCKET s,
_In_reads_bytes_(namelen) const struct sockaddr FAR * name,
_In_ int namelen
);
MyBind= ::bind;
int ret = MyBind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
if (0 > ret)
{
printf("bind\n");
return -1;
}
测试一下,居然很神奇的编译通过,且能正常使用了,我的天呀。。。
说明:
看起来和直接调用::bind一样,但实际上如果直接使用::bind还是会报错,如下
int ret = ::bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
error C2440: “初始化”: 无法从“std::_Binder<std::_Unforced,SOCKET &,sockaddr *,std::size_t>”转换为“int”