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 &
, поэтому вам не нужночто-нибудь еще.