std :: map的困难

时间:2012-01-22 10:02:01

标签: c++ stl map std

编辑: 数据如下

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 个答案:

答案 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返回

一致

编辑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 &表示,因此您不需要任何其他内容。