微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c++ using namespace std 导致bind()错误和迭代器豁免

如何解决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,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();

不是在迭代器之前...

解决方法

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

  • std 命名空间中存在一个名为 bind 的函数。
  • WinSock2 套接字库中存在一个名为 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)

使用 autorange-based-for-loop

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。