Сложности с std :: map - PullRequest
       25

Сложности с std :: map

0 голосов
/ 22 января 2012

Edit: Данные следующие

typedef std::shared_ptr<T> Resource;
typedef std::map<std::string, Resource> ResourceMap;

Это функция

const T& Get(const std::string& key)
{
    ResourceMap::iterator itr = mResources.find(key);
    return (itr != mResources.end()) ? itr->second : mDefault;

}

Ошибка:

Error   1   error C2446: ':' : no conversion from 'sf::Texture' to 'std::tr1::shared_ptr<_Ty>'  d:\sanity\trunk\client\src\assetmanager.h   28

Также я создаю такой объект:

AssetManager<sf::Texture> imgManager;

Хорошо, извините за недостающую информацию, я спешил.

Осталась только одна проблема:

return (itr != mResources.end()) ? itr->second.get() : mDefault;

get () возвращает необработанный указатель, и мне нужно вернуть ссылку на то, на что указывает shared_ptr.

Как мне это сделать?

1 Ответ

1 голос
/ 22 января 2012
Error   1   error C2446: ':' : no conversion from 'sf::Texture' to
'std::tr1::shared_ptr<_Ty>' d:\sanity\trunk\client\src\assetmanager.h 28

Полагаю, ваша проблема в том, что itr->second относится к одному типу (Resource, если ваш std::map typedef правильный), тогда как mDefault должно быть чем-то другим.

троичный оператор не может обрабатывать два разных типа, поэтому вы должны исправить свой код, чтобы убедиться, что оба элемента слева и справа от : части оператора ?: относятся к одному и тому же типу (или совместимы).

Итак, подтвердите это, мне нужно:

  • объявление Resource типа
  • объявление T типа
  • объявлениеmDefault переменная-член

Редактировать

Предположим, у вас есть что-то вроде:

typedef std::shared_ptr<T> Resource;
typedef std::map<std::string, Resource> ResourceMap;

template <typename T>
class AssetManager
{
    const T& Get(const std::string& key)
    {
        ResourceMap::iterator itr = mResources.find(key);
        return (itr != mResources.end()) ? itr->second : mDefault;
    }

    ResourceMap mResources ;
    ??? mDefault ;

    // etc.
} ;

, например:

AssetManager<sf::Texture> imgManager;

СейчасМне нужен тип mDefault, чтобы продолжить.

Мое предположение: Вы ДОЛЖНЫ убедиться, что ваш код больше похож на:

    const T& Get(const std::string& key) const
    {
        ResourceMap::const_iterator itr = mResources.find(key);
        return (itr != mResources.end()) ? *(itr->second) : *(mDefault);
    }

    ResourceMap mResources ;
    Resource mDefault ;

Поскольку вы хотите вернуть Resource,не shared_ptr Resource.

Обратите внимание, что я добавил const ключевые слова / префикс для соответствия const return

Eдит 2

Как у вас есть:

    ResourceMap mResources ;
    T mDefault ;

Итак, я думаю, вы должны написать:

    const T& Get(const std::string& key) const
    {
        ResourceMap::const_iterator itr = mResources.find(key);
        return (itr != mResources.end()) ? *(itr->second) : mDefault;
    }

itr->second - это умный указатель, так что если вы хотитечтобы получить объект указателя, вам просто нужно разыменовать умный указатель: *(itr->second).

Что касается возврата ссылки на mDefault, это указывается типом возврата функции const T &, поэтому вам не нужночто-нибудь еще.

...