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: エラー: タイプ 'std::map, std: の式からのタイプ 'sf::Texture&' の参照の初期化が無効です: :shared_ptr, std::less >, std::allocator, std::shared_ptr > > >::mapped_type {aka std::shared_ptr}'" 理由がわからず、テンプレートと STL を使用してエラーを理解しようとするのは非常に難しい私に。何が悪いのかわかりません。

2つ目はちょっとした質問です。行: 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 に答える