error C2678: 二进制“==”: 没有找到接受左操作数的运算符
error C2678: binary '==' : no operator found which takes a left-hand operand
我不明白为什么我会收到这个错误,但同样的 class 在 VS15 下工作得很好,现在我使用的是 VS12,这是一个简单的 Winsock2 实现,
int Net::createServer(int port, int protocol)
{
int status;
// ----- Initialize network stuff -----
status = initialize(port, protocol);
if (status != NET_OK)
return status;
localAddr.sin_addr.s_addr = htonl(INADDR_ANY); // listen on all addresses
// bind socket
if (bind(sock, (SOCKADDR *)&localAddr, sizeof(localAddr)) == SOCKET_ERROR)
{
status = WSAGetLastError(); // get detailed error
return ((status << 16) + NET_BIND_FAILED);
}
bound = true;
mode = SERVER;
return NET_OK;
}
问题出在这里
if (bind(sock, (SOCKADDR *)&localAddr, sizeof(localAddr)) == SOCKET_ERROR)
控制台日志:
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=size_t,
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> ]
(这里有点信仰的飞跃,但我很确定我做对了)。
错误的原因是您的程序中某处有一个 using namespace std
语句(这太糟糕了!)现在 BSD 套接字 bind()
函数与 STL std::bind
函数冲突.
一劳永逸地停止使用 using namespace std
语句,问题就会消失。否则,您必须限定从哪个命名空间中提取 bind()
,在本例中为全局命名空间:
if (::bind(sock, (SOCKADDR *)&localAddr, sizeof(localAddr)) == SOCKET_ERROR)
我不明白为什么我会收到这个错误,但同样的 class 在 VS15 下工作得很好,现在我使用的是 VS12,这是一个简单的 Winsock2 实现,
int Net::createServer(int port, int protocol)
{
int status;
// ----- Initialize network stuff -----
status = initialize(port, protocol);
if (status != NET_OK)
return status;
localAddr.sin_addr.s_addr = htonl(INADDR_ANY); // listen on all addresses
// bind socket
if (bind(sock, (SOCKADDR *)&localAddr, sizeof(localAddr)) == SOCKET_ERROR)
{
status = WSAGetLastError(); // get detailed error
return ((status << 16) + NET_BIND_FAILED);
}
bound = true;
mode = SERVER;
return NET_OK;
}
问题出在这里
if (bind(sock, (SOCKADDR *)&localAddr, sizeof(localAddr)) == SOCKET_ERROR)
控制台日志:
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=size_t,
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> ]
(这里有点信仰的飞跃,但我很确定我做对了)。
错误的原因是您的程序中某处有一个 using namespace std
语句(这太糟糕了!)现在 BSD 套接字 bind()
函数与 STL std::bind
函数冲突.
一劳永逸地停止使用 using namespace std
语句,问题就会消失。否则,您必须限定从哪个命名空间中提取 bind()
,在本例中为全局命名空间:
if (::bind(sock, (SOCKADDR *)&localAddr, sizeof(localAddr)) == SOCKET_ERROR)