好吧,我必须说,使用 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 函数来获得更好的性能吗?因为我想在使用硬币容器时尽可能避免使用临时对象,但我认为我并不了解所有内容,所以我不确定。
谢谢!