2016-07-04 2 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

вздох, я думал, что я просто отставал от того, как я использовал unique_ptr. Нет точного руководства, за которым я следую, но я обновлю свое сообщение лучше, расскажу о своей проблеме. дайте мне несколько минут <3 – Honor

+0

Нет. Это не то, как вы это делаете. Если динамического распределения памяти нет, то 'unique_ptr' не имеет смысла. Кроме того, загляните в 'std :: make_unique', когда вы * сделаете * найти реальный прецедент. Возможно, вам следует описать *, что * вы хотите сделать, а не * то, что вы сейчас делаете. –

+1

Ну, программирование, гадание не работает. И давайте не будем использовать отвратительные, постыдные термины вроде «отсталых», а? –

ответ

1

std::unique_ptr - это время только для перемещения, то есть вы не можете его скопировать.

Чтобы исправить это, используйте std::move:

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

Если это может быть скопирована, как вы делали, то вы бы два unique_ptr «S, указывающие на тот же объект (который является нонсенс, так как они уникальный), поэтому вы должны переместить его, вызывая оператор move-assign-operator.

+0

Aha !! Вот так, спасибо! Я бы возвышался, но больше не имел более 15 наименований; – Honor

+0

@Honor, если ответ отвечает на ваш вопрос, вы должны отметить его как это. –

Смежные вопросы