代码之家  ›  专栏  ›  技术社区  ›  Ken Smith

使用带有boost的winsock bind()调用时出现“无法推导模板参数”错误

  •  2
  • Ken Smith  · 技术社区  · 15 年前

    我对C++是相当陌生的,而且我很可能超过了我的头脑,但就是这样。

    我正在使用一个相当大的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”)使用bind()的boost版本,但是对于我来说,我不知道这是在哪里发生的。我使用的boost的唯一部分是boost/thread.hpp,我没有在netserver.cpp或它链接到的头文件中使用的任何名称空间。

    关于我做错了什么,或者如何排除故障,有什么建议吗?这显然是个愚蠢的新手,但我想不出来。

    3 回复  |  直到 12 年前
        1
  •  3
  •   Warren Young    14 年前

    有一个 Boost function called bind() 这完全不同于 Winsock's bind() .

    如果您需要给定模块中的两个可用功能,则有两个选项:

    1. 不要说“使用名称空间提升”。相反,在代码中显式限定boost的使用。我更喜欢这个选项,因为Boost是一个第三方库,它的短名称可能与其他第三方库和未来的采用升压功能的C++版本冲突。偶尔,如果一个函数包含几个boost用法,我会在它内部说“使用名称空间boost”。

    2. 显式限定全局winsock bind()的使用:

      ::bind(mLocalSocketFd, ...

        2
  •  2
  •   fbahr    13 年前

    正如您从MSVC的神秘错误消息中看到的,您的 bind 呼叫转到 std::tr1::bind .

    所以,也许你在使用 namespace std; .

    正如@Warren Young所指出的, ::bind 会直接打给不合格的 绑定 标识符-即 WinSock 在你的情况下。

        3
  •  1
  •   hyperknot    12 年前

    我刚刚遇到了同样的问题,在这里找到了微软的官方答案: 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 boost 对于带有vs2010的bind()函数。

    如果你有什么电话 使用命名空间标准 那么提前

    将命名空间std中的所有名称都设置为不合格 名称查找。因此,winsock的bind()和 bind()在重载解析期间被考虑,因为 的bind()是一个模板,它通常会赢,但失败 稍后编译。

    解决方案 :

    要解决此问题,请在需要winsock的bind()时调用::bind(),并且 STD::bDUE()如果你想要'bb'()。当你打电话的时候 ::bind(),您要求编译器查找全局命名空间 只有。

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