我正在使用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));
答案 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容器。