我的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));
它会编译,但不起作用。我做错了什么?
答案 0 :(得分:9)
请勿使用using namespace std;
。
C ++ 11中有std::bind
。 using namespace std;
会将此版本的bind
引入全局命名空间,这可能会导致问题。您可以将::bind
用于原始的WinSock绑定,但最好保持安全并且不要使用整个命名空间。
如果您加入<thread>
,为什么会这样?由于std::thread
可能在内部使用std::bind
,因此<functional>
包含std::bind
,其中{{1}}已声明。