1

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

2 回答 2

2

你的构造函数没问题。unique_ptr一个可能的问题是,在将两个s 提供给构造函数时,您没有移动它们:

#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()

于 2013-02-23T18:17:45.327 回答
1

您还没有提到您要emplace_back进入的容器,但假设它是 a 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)});
}
于 2013-02-23T18:25:51.283 回答