首页 > 解决方案 > c++ using namespace std 导致 bind () 错误和迭代器放弃

问题描述

我添加时遇到问题

using namespace std;

编译器说没有任何糖果可以渴望绑定。

简单的例子:

#include <winsock2.h>
#include <mutex>
#include <iostream>

using namespace std;

int main()
{
    WSADATA wsa;
    long rc = WSAStartup(MAKEWORD(2, 0), &wsa);
    SOCKADDR_IN addr;
    SOCKET acceptSocket = socket(AF_INET, SOCK_STREAM, 0);


    memset(&addr, 0, sizeof(SOCKADDR_IN));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(1234);
    addr.sin_addr.s_addr = ADDR_ANY;
    rc = bind(acceptSocket, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));

    return 0;
}

现在会很简单

using namespace std;

放弃......但我还有更多:

    std::vector<Structs*>::iterator it = m_ClientList.begin();
    for (; it != m_ClientList.end(); ++it)

当我删除 using namespace std 时,我收到以下错误消息:

C2672 "std :: invoke": no matching overloaded function found 
C2893 Function template "unknown-type std :: invoke (_Callable &&, _ Types && ...) noexcept (<expr>)" could not be specialized 

我不知道在哪里放另一个 std :: in

std::vector<Structs*>::iterator it = m_ClientList.begin();

不是在迭代器之前...

标签: c++

解决方案


不要使用using namespace std;. 您遇到了它导致的主要问题:

  • std命名空间中存在一个名为 的函数bind
  • WinSock2Sockets 库中有一个名为bind.

通过包含using namespace std,编译器不知道该选择哪一个。

无论如何,使用using namespace std与否,都会迫使您通过std::bind(...)::bind(...)

您遇到的错误std::invoke是一个单独的问题。你包括<functional>标题吗?


至于这个:

std::vector<Structs*>::iterator it = m_ClientList.begin();
for (; it != m_ClientList.end(); ++it)

使用auto和一个range-based-for-loop

for(auto& client : m_ClientList) {
    //...
}

推荐阅读