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

问题描述 投票:0回答:3

我正在使用 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 c\include\utility(182): 错误 C2248: 'std::unique_ptr<_Ty>::unique_ptr':无法访问私有成员 在类 'std::unique_ptr<_Ty>' 1> 中声明为 1>
[ 1> _Ty=sf::声音 1> ] 1> c:\program 文件 (x86)\microsoft Visual Studio 11.0 c\include\memory(1447) :参见 声明 'std::unique_ptr<_Ty>::unique_ptr' 1> 和 1> [ 1> _Ty=sf::声音 1> ] 1> c:\program 文件 (x86)\microsoft Visual Studio 11.0 c\include\xmemory0(617) : 请参阅函数模板实例化参考 'std::pair<_Ty1,_Ty2>::pair(std::pair<_Ty1,_Ty2> &&,void **)' 正在编译 1> 与 1> [ 1>
_Ty1=const std::unique_ptr, 1> _Ty2=std::unique_ptr, 1> _Kty=std::unique_ptr, 1> _Ty=std::unique_ptr 1> ]

我也尝试使用 make_pair 插入数据,但遇到同样的问题。我缺少什么?我已经尝试解决这个问题两个小时了,但无法解决它。

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

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));
c++ maps
3个回答
2
投票

查看

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

0
投票

在 C++20 中,现在可以使用

Heterogenous Lookup
在映射中使用 unique_ptr 键。

事实上,能够使用

unique_ptr
键是引入异构查找的动机之一。

工作示例:https://godbolt.org/z/PTjEjb7Go


-2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.