我有一个Load-Method来构建我的unique_ptr(稍后将会有多个)以及一个将这些unique_ptr添加到我的无序地图的方法.但是代码没有编译,我猜它与范围有关...
这是代码:
#include <unordered_map>
#include <memory>
class MyClass
{
public:
std::string Name;
};
using Map = std::unordered_map<std::string,std::unique_ptr<MyClass>>;
class MyContainer
{
private:
Map myMap;
void AddItem(std::unique_ptr<MyClass> item)
{
myMap.emplace("test", item);
}
public:
void LoadItems()
{
//Read a file ... do something before etc..
std::unique_ptr<MyClass> someItem(new MyClass);
someItem->Name = "FooBar";
AddItem(someItem);
}
};
Run Code Online (Sandbox Code Playgroud)
这是g ++错误消息之一:
错误:使用已删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr(const std :: unique_ptr <_Tp,_Dp>&)[with _Tp = MyClass; _Dp = std :: default_delete]'
让这个工作的最佳方法是什么?我尝试更改AddItem方法的签名,如下所示:
void AddItem(std::unique_ptr<MyClass>& item) //takes a reference now...
Run Code Online (Sandbox Code Playgroud)
这导致了一个真正神秘的错误消息:
在实例化'constexpr std :: pair <_T1,_T2> :: pair(_U1 &&,const _T2&)[与_U1 = const char(&)[5]; =无效 _T1 = const std :: basic_string; _T2 = std :: unique_ptr]':e:\ devtools\winbuilds\include\c ++\4.8.3\bits\hashtable_policy.h:177:55:'std :: __ detail :: _ ...
Bo *_*son 11
你不能复制unique_ptr,因为它不会是唯一的.你必须移动它 - AddItem(std::move(someItem));和myMap.emplace("test", std::move(item));.
| 归档时间: |
|
| 查看次数: |
2986 次 |
| 最近记录: |