0

unordered_map在我当前的 C++ 项目中使用了一个并且有以下问题:

当我将一对对象插入 中unordered_map时,程序中断,Windows 向我显示它是“[...].exe 已停止工作”,而没有在控制台 (cmd) 上给我任何信息。一些示例代码:

#include <unordered_map>

#include <network/server/NetPlayer.h>
#include <gamemodel/Player.h>


int main(int argc, char **argv) {
    NetGame game;
    boost::asio::io_service io_service;

    NetPlayerPtr net(new NetPlayer(io_service, game));
    PlayerPtr player(new Player);

    std::unordered_map<PlayerPtr, NetPlayerPtr> player_map;

    // Here it breaks:
    player_map[player] = net;

    return 0;
}

我已经尝试过的:

我尝试用 try-catch 换行,但没有成功。

有关代码的详细信息:

NetPlayerPtr 和 PlayerPtr 是boost::shared_ptr对象,前者包含一些boost::asio对象,如io_servicesocket,后者包含几个自定义对象。

我正在使用在 64 位 Windows 上启用 C++11 的 MinGW gcc 进行编译。

如果需要更多详细信息,请询问。

4

1 回答 1

3

好的,让我们看看您链接到的代码:

namespace std
{
    template<>
    class hash<Player>
    {
    public:
        size_t operator()(const Player &p) const
        {
            // Hash using boost::uuids::uuid of Player
            boost::hash<boost::uuids::uuid> hasher;
            return hasher(p.id);
        }
    };

    template<>
    class hash<PlayerPtr>
    {
    public:
        size_t operator()(const PlayerPtr &p) const
        {
            return hash<PlayerPtr>()(p);   // infinite recursion
        }
    };
}

您的hash<PlayerPtr>::operator(). 你可能想要的是:

return hash<Player>()(*p);

或者:

return hash<Player*>()(p->get());

取决于您是想通过其内部 id 还是其地址来识别播放器。

于 2012-12-21T16:25:07.963 回答