2

SDL_image で辞書を作成したのと同じように、SDL_ttf でフォントの辞書を作成しようとしています。フォントは に格納されているため、pnt_sizeこの情報を含む構造体を作成しました。

    struct fontinfo
    {
        string assetname;
        int size;
    };

両方の辞書が続きます:

map<string, SDL_Surface*> imageDictionary;
map<fontinfo*, TTF_Font*> fontDictionary;

2 つの違いは、フォント ディクショナリには、ファイルへの文字列だけでなく、フォントのサイズも含める必要があることです。

次に、オブジェクトによって画像またはフォントが要求されると、そのget関数が呼び出されます。今はgetSpriteうまくいきます:

    SDL_Surface* ResourceManager::getSprite(string assetname)
    {
        if (assetname == "")
        return NULL;

        map<string, SDL_Surface*>::iterator it = imageDictionary.find(assetname);
        if (it != imageDictionary.end())
            return it->second;
        else
        {
            SDL_Surface* image = Load_Image(assetname);
            if (image != NULL)
                imageDictionary.insert(make_pair(assetname, image));
            return image;
        }
    }

メソッドは、 a の代わりに a をgetFont使用するという事実を除いて、ほぼ同じです。fontinfostring

    TTF_Font* ResourceManager::getFont(string assetname, int size)
    {
        if (assetname == "" || size < 0)
            return NULL;

            fontinfo* info = new fontinfo();

            info->assetname = assetname;
            info->size = size;
            map<fontinfo*, TTF_Font*>::iterator it = fontDictionary.find(info);
            if (it != fontDictionary.end())
                return it->second;
            else
            {
                TTF_Font* font = Load_Font(assetname, size);
                if (font != NULL)
                    fontDictionary.insert(make_pair(info, font));
                return font;
            }
    }

コンパイラは、識別子が見つからずmake_pair未定義であると通知make_pairしますが、関数 fromのみですgetFont。に問題はありませmake_pairgetSprite

4

2 に答える 2

6

最初の例では、最初の引数がその名前空間 ( ) にあるため、呼び出すmake_pairと、コンパイラはそれを見つけます。2 番目の例では、コンパイラが を参照する理由がないため、明示的に と言う必要があります。namespace stdstd::stringnamespace stdstd::make_pair

暗黙的な一致機能は、ADL または Koenig ルックアップとして知られています: https://en.wikipedia.org/wiki/Argument-dependent_name_lookup

補足として、 への引数としてmyMapType::value_type(foo, bar)ではなく、を使用することをお勧めします。これは、foo と bar の型がマップの型 (const 修飾子を含む) と正確に一致しない場合、一部のコンパイラは一時ペアのコピーを最適化できないためです。これは確かにマイクロ最適化であるため、より読みやすいと思われる場合は自由に使用してください。ただし、注意してください。std::make_pair(foo, bar)std::map::insertmake_pair

于 2013-04-29T00:21:30.110 に答える
0

明示的であり、名前空間make_pairから必要であることを述べてくださいstd

imageDictionary.insert(std::make_pair(assetname, image));

2番目の関数では、この名前空間からの引数がないため、コンパイラはそれを見つける手段がないためstdです(コンパイラは、メンバーを解決するためにこの名前空間でルックアップを行いません)

fontDictionary.insert(std::make_pair(info, font));
于 2013-04-29T00:26:42.973 に答える