ZBLOG

if (m_sock == INVALID_SOCKET) { //if (InitSocket() == false)return false; _beginthread(&CClientSocket::threadEntry, 0, this); } auto pr = m_mapAck.insert(std::pair (pack.hEvent, lstPacks)); m_mapAutoClosed.insert(st...

您在使用 std::map<HANDLE, std::list<CPacket>&> 时遇到问题,这里有几个需要注意的地方:

  1. 引用类型std::list<CPacket>& 是一个引用类型,意味着它不能直接作为 std::map 的值类型。标准库容器要求值类型是可拷贝的,而引用不满足这一条件。您可以考虑将其改为 std::list<CPacket>,如下所示:

    std::map<HANDLE, std::list<CPacket>> m_mapAck;
    
  2. 迭代器使用:由于您将 m_mapAck 改为使用非引用类型后,您的迭代器声明就会相应变更,不再需要针对引用做特别处理。

  3. erase 方法:如果使用了正常的值类型(即非引用),那么在查找并找到后,可以直接调用 m_mapAck.erase(it) 来删除对应的键值对。

  4. 完整示例修改: 以下是经过修正后的代码片段:

    if (m_sock == INVALID_SOCKET)
    {
        //_beginthread(&CClientSocket::threadEntry, 0, this);
    }
    
    
    auto pr = m_mapAck.insert(std::pair<HANDLE, std::list<CPacket>>
        (pack.hEvent, lstPacks));
    
    
    m_mapAutoClosed.insert(std::pair<HANDLE,bool>
        (pack.hEvent, isAutoClosed));
    
    
    m_lstSend.push_back(pack);
    
    
    WaitForSingleObject(pack.hEvent, INFINITE); // 无限等待
    
    
    auto it = m_mapAck.find(pack.hEvent); // 自动推导
    
    
    if (it != m_mapAck.end())
    {   
        m_mapAck.erase(it);
        return true;
    }
    
    
    return false;
    
  5. 其他潜在问题

    • 确保 pack.hEvent 在插入和查找时都有效且存在于 map 中。
    • 确保在多线程环境下对 m_mapAck 的访问是线程安全的,可能需要加锁等措施以防数据竞争。

请根据以上建议调整您的代码。如果还有其他具体错误信息,请提供更多上下文,以便进一步帮助分析。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21960

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?