22

の使用に問題がありmap::emplace()ます。誰かが私が使用する正しい構文を理解するのを手伝ってもらえますか?私はこの例と同じことを効果的に行おうとしています。これが私のバージョンです:

#include <map>
using namespace std;

class Foo
{
  // private members

  public:
    Foo(int, char, char) /* :init(), members() */ {  }

    // no default ctor, copy ctor, move ctor, or assignment
    Foo() = delete;
    Foo(const Foo&) = delete;
    Foo(Foo &&) = delete;
    Foo & operator=(const Foo &) = delete;
    Foo & operator=(Foo &&) = delete;
};


int main()
{
  map<int, Foo> mymap;
  mymap.emplace(5, 5, 'a', 'b');

  return 0;
}

GCC 4.7(-std=c++11フラグ付き)では、emplace回線でエラーが発生しています。上でリンクした例では、プリミティブの代わりにカスタムタイプを処理する方法については何も述べていません。

4

2 に答える 2

25

コンテナーのemplaceメンバーは、指定された引数を使用して要素を構築します。

あなたのvalue_typeマップのはstd::pair<const int, Foo>であり、その型には引数をとるコンストラクターがあり{ 5, 5, 'a', 'b' }ません。つまり、これは機能しません:

std::pair<const int, Foo> value{ 5, 5, 'a', 'b' };
map.emplace(value);

のコンストラクターのemplace1 つに一致する引数を使用して呼び出す必要があります。pair

適合する C++11 実装では、以下を使用できます。

mymap.emplace(std::piecewise_construct, std::make_tuple(5), std::make_tuple(5, 'a', 'b'));

しかし、GCC 4.7 もその構文をサポートしていません (GCC 4.8 はリリース時にサポートされます)。

于 2012-12-28T20:48:06.217 に答える
3

GCC4.7はemplace機能を完全にはサポートしていません。

GCC4.7.2でのC++11のサポートについてはこちらをご覧ください。

于 2012-12-28T20:07:36.177 に答える