15年11个月前IP:未同步
281465
1楼
Re:错误 1214 error C2039: “_Type”: 不是“std::tr1::_Result_type2<__f
在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())来解决。


来自:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

问题解决,结贴
评论
文号 / 281465

万流景仰
名片发私信
学术分 15
总主题 317 帖总回复 5576 楼拥有证书:进士 学者 机友 笔友
注册于 2008/03/06 02:57:45最后登录 2026/10/20 13:40:53
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:0

个人简介

Inspiration, Innovation, Discovery

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的