C++ std::map的难点
编辑: 数据如下:C++ std::map的难点,c++,stl,map,std,C++,Stl,Map,Std,编辑: 数据如下: typedef std::shared_ptr<T> Resource; typedef std::map<std::string, Resource> ResourceMap; 错误: Error 1 error C2446: ':' : no conversion from 'sf::Texture' to 'std::tr1::shared_ptr<_Ty>' d:\sanity\trunk\client\src\asse
typedef std::shared_ptr<T> Resource;
typedef std::map<std::string, Resource> ResourceMap;
错误:
Error 1 error C2446: ':' : no conversion from 'sf::Texture' to 'std::tr1::shared_ptr<_Ty>' d:\sanity\trunk\client\src\assetmanager.h 28
get()返回原始指针,我需要返回对共享\u ptr所指向内容的引用
我该怎么做
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;
由于要返回资源
,而不是资源
的共享ptr
注意,我添加了const
关键字/前缀以与const
返回一致
编辑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&
指示,所以你不需要更多了。什么是mResources类型?你能展示一下mResources
的声明吗?所以我猜t
和Resource
是同一类型的吗?你给我们的信息非常不完整(这可以解释你的问题的-1
),所以必须猜很多。例如,我们必须猜测Get
函数是AssetManager
的一个方法……现在itr->second.Get()的类型是sf::Texture*我如何将其转换为sf:Texture&?T是sf::Texture mDefault是TWell,谢谢,错误已经消失,但是:错误1错误C2440:“初始化”:无法从“std::\u Tree\u const\u iterator”转换为“std::\u Tree\u iterator”d:\sanity\trunk\client\src\assetmanager.h 27
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;
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 ;
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;
}