【发布时间】:2016-04-18 15:27:19
【问题描述】:
我有一个 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);
}
};
这是 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...
这会导致一个真正神秘的错误消息:
在 'constexpr std::pair<_t1 _t2>::pair(_U1&&, const _T2&) [with _U1 = const char (&)[5]; =无效; _T1 = 常量 std::basic_string; _T2 = std::unique_ptr]': e:\devtools\winbuilds\include\c++\4.8.3\bits\hashtable_policy.h:177:55: 来自 'std::__detail::_ ...
我建议在这里即时尝试这段代码,以查看错误消息: http://cpp.sh/
【问题讨论】: