C ++:#including <thread>重新定义winsock函数bind(...)?</thread>

时间:2013-12-01 16:23:53

标签: c++ multithreading bind winsock

我的CPP文件的开头:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
#define WIN32_MEAN_AND_LEAN
#include <winsock2.h>
#include <windows.h>

(直接来自madwizard.org winsock教程)。一切正常但现在只要我添加#include <thread>(在其他包括之前/之后的任何地方),以下都不会编译:

if (bind(hSocket, reinterpret_cast<sockaddr*>(&sockAddr), sizeof(sockAddr)) != 0 )
{
    throw ROTException("could not bind socket.");
}

错误的开头是:

error C2678: binary '!=' : no operator found which takes a left-hand operand of type 'std::_Bind<_Forced,_Ret,_Fun,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,<unnamed-symbol>>' (or there is no acceptable conversion)
1>          with
1>          [
1>              _Forced=false,
1>              _Ret=void,
1>              _Fun=SOCKET &,
1>              _V0_t=sockaddr *,
1>              _V1_t=unsigned int,
1>              _V2_t=std::_Nil,
1>              _V3_t=std::_Nil,
1>              _V4_t=std::_Nil,
1>              _V5_t=std::_Nil,
1>              <unnamed-symbol>=std::_Nil
1>          ]
1>          c:\home\vs\vc\include\exception(522): could be 'bool std::operator !=(const std::exception_ptr &,const std::exception_ptr &)'

所以就像绑定将类型从int更改为void。如果我只是写

bind(hSocket, reinterpret_cast<sockaddr*>(&sockAddr), sizeof(sockAddr));

它会编译,但不起作用。我做错了什么?

1 个答案:

答案 0 :(得分:9)

简短回答

请勿使用using namespace std;

答案稍长

C ++ 11中有std::bindusing namespace std;会将此版本的bind引入全局命名空间,这可能会导致问题。您可以将::bind用于原始的WinSock绑定,但最好保持安全并且不要使用整个命名空间。

如果您加入<thread>,为什么会这样?由于std::thread可能在内部使用std::bind,因此<functional>包含std::bind,其中{{1}}已声明。