2012-12-21 34 views
0

我在当前的C++项目中使用unordered_map,并有以下问题:unordered_map shared_ptrs的突破C++程序

当我插入一对对象进入unordered_map,在PROGRAMM休息和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,后者包含几个自定义对象。

我正在用MinGW gcc编译,在64位Windows上启用C++ 11。

如果需要更多的细节,请询问。

+3

你试过调试器吗? –

+0

不,我没有像GDB这样的调试器的使用经验(如果你正在谈论这个)。 – msiemens

+7

@ m - s现在是你的机会! – 2012-12-21 10:54:47

回答

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()的inifinite递归。你可能想要的是:

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

或:

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

取决于你是否希望通过其内部的ID或地址来识别玩家。

+1

嗯......我需要为一个变量提供'hash'。哦,让我们只是'std :: hash'吧!天才! :) –

+0

是的,这解决了它。非常感谢! :) – msiemens