返回模板映射值作为参考

时间:2012-12-10 15:32:55

标签: c++ map reference c++11 std

好吧,我必须说使用C ++模板+ stl由模板+试图做快速c ++ 11代码是一件痛苦的事。大多数情况下,很多奇怪的编译器错误......我需要一个帮助,代码:

#include <SFML/Graphics.hpp>
#include <memory>
#include <map>

template <class T>
class cResourceManager
{
public:
T& get(const std::string & key);
bool add(const std::string & key, const std::shared_ptr<T> & ptr);
private:
std::map <std::string, std::shared_ptr<T> > resources;
};

template <class T>
T& cResourceManager<T>::get(const std::string & key)
{
    class std::map<std::string, std::shared_ptr<T>>::const_iterator citr =     resources.find(key);
    if (citr != resources.end()) return resources[key];
}

template <class T>
bool cResourceManager<T>::add(const std::string & key, const std::shared_ptr<T> & ptr)
{
if (resources.find(key) == resources.end())
{
    if(ptr != nullptr) 
    {
        resources.insert( std::move( std::make_pair(key, ptr) ) );
        return true; 
    }
}
return false;
}

int main(int argc, char **argv)
{
    cResourceManager<sf::Texture> resmgr;
    resmgr.add("key", std::make_shared<sf::Texture>() );
    resmgr.get("key");
    return 0;
}

在resmgr.get(“key”)行上我收到错误“main.cpp:19:51:错误:类型'sf :: Texture&amp;'类型'的引用无效初始化' std :: map,std :: shared_ptr,std :: less&gt;,std :: allocator,std :: shared_ptr&gt;&gt;&gt; :: mapped_type {aka std :: shared_ptr}'“ 我不知道为什么并尝试使用模板和STL来理解错误对我来说非常难。我不知道出了什么问题。

第二件事是一个小问题。在线: resources.insert(std :: move(std :: make_pair(key,ptr)))我需要std :: move函数才能获得更好的性能吗?因为我想在尽可能多地使用投币器时避免使用临时物品,但我不认为我理解所有事情所以我不确定。

谢谢!

1 个答案:

答案 0 :(得分:1)

错误在这一行:

if (citr != resources.end()) return resources[key];

resources[key]会为您提供std::shared_ptr<T>,但您的函数会返回T &。你需要这样的东西:

if (citr != resources.end()) return *resources[key];

如果找不到密钥,您还需要确定要执行的操作。目前,该功能在这种情况下不会返回任何内容。

至于你的另一个问题,make_pair返回一个临时对,它已经是一个rvalue,因此不需要显式移动。