1

emplace_backを使用する場合、渡されるパラメーター(k、v)のコンストラクターが存在する必要があるため、以下のコンストラクターが必要です。ただし、unique_ptrを使用しているため、「delete」にアクセスできないという文句が表示されます。これは、複数のポインターを持つことができる何かを実行していることを意味すると思います。

構文がわかりません。このコンストラクターを正しい方法で作成するにはどうすればよいですか?

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

あなたのコンストラクタはOKです。考えられる問題はunique_ptr、コンストラクターにそれらを提供するときに 2 つの を移動していないことです。

#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が、それが であると仮定すると、構造体が本当に単純で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 に答える