std:: set no tiene ningún miembro emplace


¿Implementa g++ 4.7.2 std::set::emplace, como se define en el estándar C++11 y se documenta aquí?

He escrito el siguiente pequeño caso de prueba:

#include <set>
#include <string>

struct Foo
{
    std::string mBar;
    bool operator<(const Foo& rhs) const
    {
        return mBar < rhs.mBar;
    }
    Foo(const std::string bar) : mBar(bar) {};
};

typedef std::set<Foo> Foos;

int main()
{
    Foos foos;
    foos.emplace(std::string("Hello"));
}

Bajo G++ 4.7.2, esto falla al compilar:

[john.dibling@somewhere hacks]$ g++ -o main.o -std=c++0x -c main.cpp
main.cpp: In function ‘int main()’:
main.cpp:19:10: error: ‘Foos’ has no member named ‘emplace’

También falla al compilar bajo IDEOne, sin embargo compila bajo MSVC 2012 Update 1.

Author: ildjarn, 2013-04-04

2 answers

No está implementado en gcc 4.7.2.

Hay alguna explicación:

Solo para aclarar un poco: esto no fue un descuido. Tuvimos el desagradable problema en el borrador del estándar C++0x con std:: pair, que esencialmente imposible añadir los miembros emplace_ * al mapa std::, std:: multimap, etc, sin romper el código de usuario existente. Así nosotros esperé en eso, hasta que las cosas se aclararon en toda esta área. Ahora en realidad es posible trabajar en esas instalaciones.

Su código se compila muy bien con gcc 4.8.0, véase LWS.

 26
Author: Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-04 13:55:31

emplace() para contenedores asociativos se agregó en libstdc++ para gcc 4.8.0, bajo gcc 4.7.2 no funcionará.

 5
Author: Johnny Mnemonic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-04 14:10:58