Visual Studio 2010 中的 Winsock 调用错误

   在VS2010中调用Winsock(winsock or winsock2)的bind函数时很有可能会出现一些莫名其妙的错误而导致编译失败,控制台输出的错误信息指向了库中的xxresult,和程序本身的设计似乎没有任何关联。

控制台片段:

1>c:/program files/microsoft visual studio 10.0/vc/include/xxresult(28): error C2825: '_Fty': must be a class or namespace when followed by '::'
1>         c:/program files/microsoft visual studio 10.0/vc/include/xxresult(40) : see reference to class template instantiation 'std::tr1::_Result_type2<__formal,_Fty,_Arg0,_Arg1>' being compiled
1>         with
1>         [
1>             __formal=false,
1>             _Fty=__w64 unsigned int,
1>             _Arg0=std::tr1::_Nil &,
1>             _Arg1=std::tr1::_Nil &
1>         ]
1>         c:/program files/microsoft visual studio 10.0/vc/include/xxresult(597) : see reference to class template instantiation 'std::tr1::_Result_of2<_Fty,_Farg0,_Farg1>' being compiled


        实际上这是由于在VS2010中Winsock的 bind()与TR1(C++ Technical Report 1)的bind() 冲突导致的。在VS2010中微软将TR1中的bind()声明在名称空间 std 中,而Winsock的bind() 则声明在全域(global namespace),当在代码中使用“using namespace std ”这样的语句引入整个名称空间后,由于此时存在两个bind(),且TR1的bind()是一个模板在编译器重载解析时具有较高的优先级,直接调用bind()将导致了TR1对Winsock调用的覆盖,接下来在编译阶段的类型错误就不足为怪了。

        解决的方法很简单,只要让编译器能够正确区别两者就可以了。为了解决由于使用"using namespace std"带来的冲突,我们需要在全域调用时显式的声明,如 “::bind()” ,这样编译器就只会在全域中解析该函数的调用,而不会导致冲突。以后遇到类似的情况,都可以通过全域声明(::call())来解决。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Visual Studio是一款集成开发环境(IDE),用于开发各种软件应用程序。在socket编程Visual Studio可以作为开发工具,用于编写和调试与网络通信相关的代码。 根据引用提供的信息,你正在使用Visual Studio 2022进行socket编程。你复制了一份其他人的代码,并尝试运行时遇到了报错。 根据引用提供的代码片段,你使用了一个名为CInitSock的类来初始化WinsockWinsock是用于进行网络通信的Windows Socket接口。该类的构造函数在调用时会载入Winsock(使用WSAStartup函数),而析构函数则会释放Winsock(使用WSACleanup函数)。这样做可以确保在使用Winsock之前进行了正确的初始化,并在使用完后进行了释放。 根据引用提供的信息,你还需要将ws2_32.lib添加到解决方案。这个包含了Winsock的实现。添加这个可以让你的程序在链接时找到并使用Winsock提供的函数和功能。 综上所述,你正在使用Visual Studio 2022进行socket编程,通过使用CInitSock类来初始化和释放Winsock,并需要将ws2_32.lib添加到解决方案以确保程序可以正确链接和使用Winsock的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Visual Studio 2022 配置 ws2_32.lib socket编程 以及error C4996: ‘inet_addr‘ 报错处理](https://blog.csdn.net/weixin_53070140/article/details/127061059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [visual studio2015上实现一个简单socket](https://blog.csdn.net/sususuqingxiao/article/details/107110553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值