0

現在の C++ プロジェクトでを使用しunordered_mapていますが、次の問題があります。

オブジェクトのペアを に挿入するとunordered_map、プログラムが中断し、Windows はコンソール (cmd) に関する情報を提供せずに、「[...].exe が動作を停止しました」と表示します。いくつかのコード例:

#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 に答える