0

好吧,我必须说,使用 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: error: invalid initialization of reference of type of 'sf::Texture&' from expression of type'std::map, std: :shared_ptr, std::less >, std::allocator, std::shared_ptr > > >::mapped_type {aka std::shared_ptr}'" 我不知道为什么,尝试使用模板和 STL 理解错误非常困难对我来说。我不知道出了什么问题。

第二件事是一个小问题。在线:resources.insert(std::move(std::make_pair(key, ptr)))我需要 std::move 函数来获得更好的性能吗?因为我想在使用硬币容器时尽可能避免使用临时对象,但我认为我并不了解所有内容,所以我不确定。

谢谢!

4

1 回答 1

1

错误在这一行:

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

resources[key]会给你一个std::shared_ptr<T>,但你的函数返回一个T &。你需要这样的东西:

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

如果找不到密钥,您还需要决定要做什么。目前该函数在这种情况下不返回任何内容。

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

于 2012-12-10T15:41:10.167 回答