std :: unique_ptr实例化错误试图放在std :: map里面?

时间:2016-07-04 15:01:08

标签: c++ boost sfml

所以我使用SFML和Boost库试图编写ResourceManager类。我使用std :: map来包含资源。我最近听说std :: unique_ptr真的很好,因为它有内存清理(或沿着这些行的东西)。

这就是我的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

1 个答案:

答案 0 :(得分:1)

std::unique_ptr是一个仅限移动的时间,这意味着您无法复制它。

要解决此问题,请使用std::move

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

如果可以像你那样复制,那么你会有两个unique_ptr指向同一个对象(这是无意义的,因为它们是唯一的) ,所以你必须移动,调用move-assignment-operator。