2010-03-16 52 views
2

我对C++相当陌生,而且我很可能在我的脑海中,但事情就是这样。与Boost一起使用Winsock bind()调用时出现“无法推论出模板参数”错误

我正在使用一个相当大的Win32 C++项目,它使用Winsock进行网络通信。我正在尝试将一些线程管理转换为boost,但是一旦我添加了对boost库的引用,而不是,我在这行代码中遇到了大约30个错误:

bind(mLocalSocketFd, (struct sockaddr *) &localServerAddress, sizeof(localServerAddress)); 

这些错误包括像:

error C2602: 'std::tr1::_Result_of2<_Fty,_Farg0,_Farg1>::_Type' is not a member of a base class of 'std::tr1::_Result_of2<_Fty,_Farg0,_Farg1>' 
error C2868: 'std::tr1::_Result_of2<_Fty,_Farg0,_Farg1>::_Type' : illegal syntax for using-declaration; expected qualified-name 
error C2784: 'bool std::operator <(const std::vector<_Ty,_Ax> &,const std::vector<_Ty,_Ax> &)' : could not deduce template argument for 'const std::vector<_Ty,_Ax> &' from 'std::tr1::_Bind_fty<_Fty,_Ret,_BindN>' 
error C2784: 'bool std::operator <(const std::vector<_Ty,_Ax> &,const std::vector<_Ty,_Ax> &)' : could not deduce template argument for 'const std::vector<_Ty,_Ax> &' from 'std::tr1::_Bind_fty<_Fty,_Ret,_BindN>' 

我猜想,不知怎的,我已经成功地告诉这个特殊的文件(“NetServer.cpp”)使用绑定()的增压版本,但对于我的生活,我无法弄清楚发生了什么。我使用boost的唯一部分是boost/thread.hpp,并且我没有使用NetServer.cpp中的任何地方或者它链接到的头文件来进行任何命名空间。

任何有关我在做什么错的建议,或者如何解决它?这显然是一些愚蠢的新手,但我无法弄清楚。

回答

2

有一个Boost function called bind()这是从Winsock's bind()完全不同的东西。

你有两个选择,如果你需要一个给定的模块中使用两种功能:

  1. 不要“使用空间boost”之称。相反,明确限定您的代码中使用Boost。我更喜欢这个选项,因为Boost是第三方库,其短名称可能与其他第三方库以及采用Boost特性的未来版本的C++发生冲突。偶尔我会在单个函数中使用“使用命名空间提升”,如果它包含几个Boost的用法。

  2. 明确限定使用全球Winsock的绑定(的):

    ::bind(mLocalSocketFd, ...

+0

我不是“使用命名空间增强;”我可以找到标题层次结构中的任何位置,这就是让我困惑的原因。我仍然不确定它为什么试图在该特定文件中使用boost命名空间。但我不知道::作为一个全局命名空间限定符。添加解决了这个问题。谢谢。 – 2010-03-17 16:03:58

2

你可以从MSVC的神秘的错误消息看,你bind电话将转入std::tr1::bind

所以,可能你使用的是namespace std;

正如@Warren Young指出的那样,::bind会将您的电话转向非标准bind标识符 - 然后在您的情况下为WinSock

+0

谢谢,我认为就是这样。 – 2011-09-16 20:15:18

1

我刚刚遇到了同样的问题,并发现了一个微软官方回答这里:http://connect.microsoft.com/VisualStudio/feedback/details/500364/how-to-avoid-conflicts-between-tr1-bind-and-winsock-bind-function

短版:即使你不调用boost命名空间,我想你有一个using namespace std地方,由于我猜你正在使用VS2010,它有tr1扩展名,所以using namespace std的作用就像using namespace boost的bind()函数与VS2010。

如果你有什么电话using namespace std提前然后

你让所有的std下提供给不合格 名称查找的名字。因此,在重载解析期间,Winsock的bind()和bind()都会被考虑,并且因为 的bind()是模板,所以它通常会获胜,但不会在以后编译 。

解决方案

为了解决这个问题,请致电:: bind()的时候,你想的Winsock的bind(),和 的std :: bind()的,如果你想的绑定( )。当你调用 :: bind()时,你要求编译器只查看全局命名空间 。

或者,不要使用名称空间标准。

相关问题