在地图中使用std :: unique_ptr作为键

时间:2015-04-27 04:23:40

标签: c++ maps

我正在使用Visual Studio 2012.我有一张如下所示的地图:

std::map<std::string,std::map<std::unique_ptr<sf::Sound>,std::unique_ptr<sf::SoundBuffer>>> listSoundContainer;

我试图插入这样的数据:

std::unique_ptr<sf::SoundBuffer> soundBuffer(new sf::SoundBuffer());
if (soundBuffer->loadFromFile("assets/sound/" + _fileName) != false)
{
    std::unique_ptr<sf::Sound> sound(new sf::Sound(*soundBuffer));
    typedef std::map<std::unique_ptr<sf::Sound>, std::unique_ptr<sf::SoundBuffer>> innerMap;
    listSoundContainer[_fileName].insert(innerMap::value_type(std::move(sound), std::move(soundBuffer)));               
}

我在编译时遇到以下错误:

  

microsoft visual studio 11.0 \ vc \ include \ utility(182):错误C2248:   &#39;的std ::的unique_ptr&LT; _Ty&GT; ::的unique_ptr&#39; :无法访问私人会员   在课堂上宣布&#39; std :: unique_ptr&lt; _Ty&gt;&#39; 1 GT; 1 >>   [1> _Ty = sf ::声音1&gt; ] 1&gt; C:\程序   files(x86)\ microsoft visual studio 11.0 \ vc \ include \ memory(1447):参见   声明&#39; std :: unique_ptr&lt; _Ty&gt; :: unique_ptr&#39; 1 GT;用1>   [1> _Ty = sf ::声音1&gt; ] 1&gt; C:\程序   files(x86)\ microsoft visual studio 11.0 \ vc \ include \ xmemory0(617):   请参阅函数模板实例化的参考   &#39;的std ::对&LT; _Ty1,_Ty2&GT; ::对(标准::对&LT; _Ty1,_Ty2&GT;   &amp;&amp;,void **)&#39;正在编译1&gt;用1> [1>   _Ty1 = const std :: unique_ptr,1&gt; _Ty2 = std :: unique_ptr,1&gt; _Kty = std :: unique_ptr,1&gt; _Ty = std :: unique_ptr 1&gt; ]

我还尝试使用make_pair插入数据同样的问题。我错过了什么?我一直试图解决这个问题2个小时,现在无法理解它。

我实际上可以通过不使用智能指针来解决这个问题:

sf::SoundBuffer* soundbuffer = new sf::SoundBuffer();
soundbuffer->loadFromFile(_file);
sf::Sound* sound = new sf::Sound(*soundbuffer);
typedef std::map<sf::SoundBuffer*, sf::Sound*> mapType;
listSound[_file].insert(mapType::value_type(soundbuffer, sound));

2 个答案:

答案 0 :(得分:1)

查看std::map的模板定义:

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >
> class map;

现在让我们看看你如何尝试实例化它:

std::map<
    std::string, 
    std::map<
        std::unique_ptr<sf::Sound>, 
        std::unique_ptr<sf::SoundBuffer>
    >
> 
listSoundContainer

这里的问题是std::unique_ptr<sf::Sound>不能作为关键。

您似乎要做的是制作某种std::pair<std::unique_ptr<sf::Sound>, std::unique_ptr<sf::SoundBuffer>>

列表

我建议改用:

std::map<
    std::string, 
    std::list<
        std::pair<
            std::unique_ptr<sf::Sound>, 
            std::unique_ptr<sf::SoundBuffer>
        >
    >
> 
listSoundContainer

答案 1 :(得分:0)

智能指针不应与STL容器结合使用。

背景是智能指针的行为不如STL容器所预期的那样。例如,STL期望复制操作的源对象保持不变。智能指针不是这种情况。这会导致您遇到奇怪的效果......

编辑:我的回答并不完全正确。从C ++ 11开始,可以使用智能指针,例如unique_ptr,带有STL容器。