我有一个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 ++错误消息之一:
错误:使用已删除的函数&#39; std :: unique_ptr&lt; _Tp, _Dp&gt; :: unique_ptr(const std :: unique_ptr&lt; _Tp,_Dp&gt;&amp;)[with _Tp = MyClass; _Dp = std :: default_delete]&#39;
让这项工作最好的方法是什么?我尝试更改AddItem方法的签名,如下所示:
void AddItem(std::unique_ptr<MyClass>& item) //takes a reference now...
这导致了一个真正神秘的错误信息:
实例化&#39; constexpr std :: pair&lt; _T1,_T2&gt; :: pair(_U1&amp;&amp;,const _T2&amp;)[with _U1 = const char(&amp;)[5]; =无效_T1 = const std :: basic_string; _T2 = std :: unique_ptr]&#39;:e:\ devtools \ winbuilds \ include \ c ++ \ 4.8.3 \ bits \ hashtable_policy.h:177:55: 需要来自&#39; std :: __ detail :: _ ...
我建议在这里动态尝试这段代码,以查看错误消息: http://cpp.sh/
答案 0 :(得分:11)
您无法复制NSString *script = @"document.getElementsByTagName('body')[0].innerHTML.length";
NSString *length = [self.webView stringByEvaluatingJavaScriptFromString:script];
if (length.integerValue > 0) {
NSLog(@"not empty");
}
,因为它不会是唯一的。您必须移动它 - unique_ptr
和AddItem(std::move(someItem));
。
答案 1 :(得分:2)
您正在尝试复制不允许的 unique_ptr (该构造函数已被删除,因为gcc在错误中说明)。而不是你可以尝试使用 std :: move :
#include <unordered_map>
#include <memory>
#include <utility>
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", std::move(item));
}
public:
void LoadItems()
{
//Read a file ... do something before etc..
std::unique_ptr<MyClass> someItem(new MyClass);
someItem->Name = "FooBar";
AddItem(std::move(someItem));
}
};
请注意,之后不要使用移动的对象。
您可以考虑改用 shared_ptr 。