编辑: 数据如下
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指向的引用。
我该怎么做?
答案 0 :(得分:1)
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
,而不是Resource
的shared_ptr。
请注意,我添加了const
个关键字/前缀以与const
返回
正如你所说:
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 &
表示,因此您不需要任何其他内容。