当使用emplace_back时,传递的参数(k,v)必须存在构造函数,因此我需要下面的构造函数。然而,因为我使用unique_ptr它抱怨无法访问'删除',我相信这意味着我正在做一些允许我有一个以上指针的东西。
我无法弄清楚语法。如何以正确的方式编写此构造函数?
struct KV{
unique_ptr<string> k, v;
KV(){}
KV (unique_ptr<string> k_,unique_ptr<string> v_):k(move(k_)),v(move(v_)){}
};
答案 0 :(得分:2)
你的构造函数没问题。可能的问题是,在将两个unique_ptr
提供给构造函数时,您没有移动它们:
#include <memory>
#include <string>
using namespace std;
struct KV{
unique_ptr<string> k, v;
KV(){}
KV (unique_ptr<string> k_,unique_ptr<string> v_):k(move(k_)),v(move(v_)){}
};
int main()
{
unique_ptr<string> p1(new string());
unique_ptr<string> p2(new string());
// KV v(p1, p2); // ERROR!
KV kv(move(p1), move(p2)); // OK
vector<KV> v;
v.emplace_back(move(p1), move(p2)); // OK
}
<强>更新强>
当VS2012发布时,VC11不支持可变参数模板。 emplace_back()
的正确实现应该是可变的,但MS提供了虚拟实现。发布CTP时,只更新编译器并支持可变参数模板,但STL尚未更新。因此,您仍然会收到错误。
如果您无法更改编译器,除了等待下一个版本的产品发布之外,没有太多事情可做。同时,请避免使用emplace_back()
并改为使用push_back()
。
答案 1 :(得分:1)
你还没有提到你想要emplace_back
进入的容器,但假设它是vector
,如果你的KV
结构非常简单,那么就没有必要声明任何构造函数。只需使用聚合初始化。
#include <memory>
#include <string>
#include <utility>
#include <vector>
using namespace std;
struct KV
{
unique_ptr<string> k, v;
// KV(){}
// KV (unique_ptr<string> k_,unique_ptr<string> v_):k(move(k_)),v(move(v_)){}
};
int main()
{
unique_ptr<string> p1(new string());
unique_ptr<string> p2(new string());
KV v{move(p1), move(p2)}; // initialize an instance
// this step is not necessary, you can skip it
vector<KV> vec;
vec.emplace_back(KV{move(v.k), move(v.v)});
}