c++ gcc c++11 gcc4.7

c++ - map:: emplace() con un tipo de valor personalizado



gcc c++11 (2)

Tengo problemas para usar map::emplace() . ¿Alguien puede ayudarme a encontrar la sintaxis correcta para usar? Estoy tratando efectivamente de hacer lo mismo que en este ejemplo . Aquí está mi versión:

#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; }

Bajo GCC 4.7 (con el -std=c++11 ), estoy extrayendo el error en la línea de la página. El ejemplo que he vinculado anteriormente no dice nada acerca de cómo tratar con tipos personalizados en lugar de primitivos.


El miembro emplace un contenedor construye un elemento utilizando los argumentos suministrados.

El value_type de su mapa es std::pair<const int, Foo> y ese tipo no tiene ningún constructor que tome los argumentos { 5, 5, ''a'', ''b'' } es decir, esto no funcionaría:

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

emplace llamar a emplace con argumentos que coincidan con uno de los constructores de los pair .

Con una implementación conforme a C ++ 11, puede usar:

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

pero GCC 4.7 tampoco admite esa sintaxis (GCC 4.8 lo hará cuando se lance).


GCC 4.7 no tiene soporte completo para las funciones de emplace .

Puede ver compatibilidad con C ++ 11 en GCC 4.7.2 aquí .