C++11 bing与socket bind冲突问题(解决)

问题如下现象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”

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值