2016-07-04 7 views
-1

私はSFMLとBoostライブラリを使ってResourceManagerクラスを作成しようとしています。私はstd :: mapを使ってリソースを格納しています。私は最近、メモリクリーンナップ(またはそれらの行に沿ったもの)のため、std :: unique_ptrが本当に良いと聞いています。std :: unique_ptr std :: map内に配置しようとすると、エラーをインスタンス化しますか?

これは私のResourceManagerクラスは、次のようになります。ここでは

#pragma once 

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

#include "Resource.h" 


class ResourceManager 
{ 
    public: 
     ResourceManager(); 
     void clear(); 
     void dump(); 
     boost::any getResource(std::string s); 
     sf::Texture loadTexture(std::string s, sf::IntRect d); 
     void unloadTexture(std::string s); 

    private: 
     std::map<std::string, std::unique_ptr<boost::any>> resource; 
}; 

は、私は私がここにこのエラーが出ますが、私のマップ

sf::Texture ResourceManager::loadTexture(std::string s, sf::IntRect d) 
{ 
    std::unique_ptr<sf::Texture> t; 

    if (!t->loadFromFile(s, d)) 
     std::cout << "Error loading resource: " << s << std::endl; 

    resource[s] = t; 
} 

にオブジェクトをロードするために使用しようとしている方法であり、この行はhttp://i.imgur.com/0uDZvvw.png

+0

sigh、私はちょうど私がunique_ptrをどのように使用していたのか遅れていると思った。私が従う正確なガイドはありませんが、私のポストを更新して、私の問題を説明しています。私に数分<3 – Honor

+0

を教えてください。それはあなたのやり方ではありません。動的メモリ割り当てがない場合、 'unique_ptr'は意味をなさない。また、実際のユースケースを見つけたときに 'std :: make_unique'を調べてください。たぶんあなたはあなたが現在やっていることではなく、あなたが何をしたいのかを記述するべきです。 –

+1

まあ、推測によるプログラミングはうまくいかない。そして、「遅らせる」のような嫌な言葉を使ってはいけませんか? –

答えて

1

std::unique_ptrです。これは移動できないため、コピーできません。

std::moveを使用し、それを修正するには:あなたは、彼らがであるため、非感覚で同じオブジェクト(を指す2つのunique_ptr年代を持つことになり、

resource[s] = std::move (t); 

あなたがやったようにそれをコピーすることができればユニーク)、に移動し、移動割り当て演算子を呼び出す必要があります。

+0

ああ!それで、ありがとう!私はupvoteだろうが、もはや15を超えているrep; - ; – Honor

+0

@Honor答えがあなたの質問に答えるなら、あなたはそれをそれにマークするべきです。 –

関連する問題