2013-04-04 36 views
24

g + 4.7.2 implementa std::set::emplace, come definito dallo standard C++ 11 e documentato here?std :: set non ha un membro emplace

ho scritto il seguente piccolo banco di prova:

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

Sotto G ++ 4.7.2, questo non riesce a compilare:

[[email protected] 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’ 

inoltre non riesce a compilare sotto IDEOne, tuttavia si compila sotto Aggiornamento MSVC 2012 1.

risposta

26

It is not implemented in gcc 4.7.2.

C'è qualche spiegazione:

Giusto per chiarire un po ': questo non era un svista. Abbiamo avuto il problema fastidioso nella bozza di C++ 0x standard con std :: pair, che essenzialmente reso impossibile aggiungendo i membri emplace_ * a std :: map, std :: multimap, ecc, senza violare l'utente esistente codice. Pertanto, abbiamo aspettato questo , fino a quando le cose non sono state chiarite in tutta questa zona. Ora è effettivamente possibile lavorare su quelle strutture.

Il codice si compila bene con gcc 4.8.0, vedere LWS.

5

emplace() per contenitori associativi è stato aggiunto in libstdc++ per gcc 4.8.0, in gcc 4.7.2 i non funzionerà

Problemi correlati