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;
    }