我在当前的C ++项目中使用unordered_map
并遇到以下问题:
当我将一对对象插入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_service
等socket
个对象,后者包含多个自定义对象。
我正在使用在64位Windows上启用C ++ 11的MinGW gcc进行编译。
如果需要更多详细信息,请询问。
答案 0 :(得分: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或地址识别播放器。