当前位置: 首页 > 知识库问答 >
问题:

使用映射内的std::unique_ptr作为键

蒋俊
2023-03-14

我正在使用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): error C2248: 'std::unique_ptr

我也试过用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));

共有2个答案

毋宏茂
2023-03-14

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

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

编辑:我的答案不完全正确。由于C 11,可以使用智能指针,例如unique_ptr和STL容器。

公良鸿光
2023-03-14

查看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

你似乎试图做的是制作某种std::p air列表

我建议改用这个:

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

 类似资料:
  • 代码如下: 我假设错误发生在insert函数中,并且与参数初始化有关。 bintree.cpp:65:27:错误:使用删除的函数'std::unique_ptr<_tp,_dp>::unique_ptr(const std::unique_ptr<_tp,_dp>&)[with_tp=bintreenode;_dp=std::default_delete>]“tree.insert(tree.ro

  • 问题内容: 我对boost.python相当陌生,并试图将函数的返回值公开给python。 函数签名如下所示: 在python中调用函数时,出现以下错误: 我在python中的函数调用如下所示: 我试图公开std :: unique_ptr,但无法使其正常工作。有人知道如何正确公开指针类吗?谢谢! 编辑: 我尝试以下操作: 这个例子可以编译,但是我仍然得到上面提到的错误。另外,我试图公开类本身 问

  • 我想实现我自己的并使用Mapstruct将记录映射到POJO。我不太明白如何完成这一点。我遵循了这部分文档:https://www.jooq.org/doc/3.13/manual/sql-execution/fetching/pojos-with-recordmapper-provider/ 我的映射器看起来像这样: 问题是,作为我实际上并没有得到,而是我的语言表中的,因此无法将转换为。知道我需

  • 当你要使用一个智能指针时,首先要想到的应该是std::unique_ptr.下面是一个很合理的假设:默认情况下,std::unique_ptr和原生指针同等大小,对于大多数操作(包括反引用),它们执行的底层指令也一样。这就意味着,尽管在内存回收直来直往的情况下,std::unique_ptr也足以胜任原生指针轻巧快速的使用要求。 std::unique_ptr具现了独占(exclusive own

  • 我正在使用STD::UNIQUE_PTR在类上创建一些公共成员,这些成员必须是不可复制或可移动的。但是STD::UNIQUE_PTR是可移动的,我想知道如果有人移动STD::UNIQUE_PTR包含的指针,然后我尝试访问被移动的那个类的STD::UNIQUE_PTR成员,会发生什么。 我所需要的就是使std::unique_ptr不可移动,并简单地保存一个唯一的指针,该指针不能从拥有它的类中移动或

  • 系统调用在调用进程的虚拟地址空间中提供映射,将文件或设备映射到内存中。 下面是两种类型 - 文件映射或文件支持的映射 - 此映射将进程的虚拟内存区域映射到文件。 这意味着读取或写入这些内存区域会导致文件被读取或写入。这是默认的映射类型。 匿名映射 - 此映射映射进程的虚拟内存区域,不受任何文件的支持。 内容被初始化为零。 这种映射类似于动态内存分配(malloc()),在某些实现中用于某些分配。