在地图中使用 std::unique_ptr 作为键
Using std::unique_ptr inside a map as a key
我使用的是 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<_Ty>::unique_ptr' : cannot access private member
declared in class 'std::unique_ptr<_Ty>' 1> with 1>
[ 1> _Ty=sf::Sound 1> ] 1> c:\program
files (x86)\microsoft visual studio 11.0\vc\include\memory(1447) : see
declaration of 'std::unique_ptr<_Ty>::unique_ptr' 1> with 1>
[ 1> _Ty=sf::Sound 1> ] 1> c:\program
files (x86)\microsoft visual studio 11.0\vc\include\xmemory0(617) :
see reference to function template instantiation
'std::pair<_Ty1,_Ty2>::pair(std::pair<_Ty1,_Ty2>
&&,void **)' being compiled 1> with 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 插入数据,但遇到了同样的问题。我错过了什么?我已经尝试解决这个问题 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));
查看 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
智能指针不应与 STL 容器结合使用。
背景是智能指针的行为不符合 STL 容器的预期。例如,STL 期望复制操作的源对象保持不变。智能指针不是这种情况。这可能会导致您正在经历的奇怪效果...
编辑: 我的回答并不完全正确。从 C++11 开始,可以使用智能指针,例如unique_ptr,使用 STL 容器。
我使用的是 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<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>' 1> with 1>
[ 1> _Ty=sf::Sound 1> ] 1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\memory(1447) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr' 1> with 1> [ 1> _Ty=sf::Sound 1> ] 1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0(617) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2>::pair(std::pair<_Ty1,_Ty2> &&,void **)' being compiled 1> with 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 插入数据,但遇到了同样的问题。我错过了什么?我已经尝试解决这个问题 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));
查看 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
智能指针不应与 STL 容器结合使用。
背景是智能指针的行为不符合 STL 容器的预期。例如,STL 期望复制操作的源对象保持不变。智能指针不是这种情况。这可能会导致您正在经历的奇怪效果...
编辑: 我的回答并不完全正确。从 C++11 开始,可以使用智能指针,例如unique_ptr,使用 STL 容器。