具有unique_ptr问题的类

时间:2013-02-23 18:13:12

标签: c++ c++11

当使用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_)){} 
};

2 个答案:

答案 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)});
}