2013-04-04 20 views
24

Czy g ++ 4.7.2 implementuje std::set::emplace, zgodnie z definicją standardu C++ 11 i dokumentacją here?std :: set nie ma członka emplace

Pisałem następujące trochę przypadek testowy:

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

trybie g ++ 4.7.2, to nie trafia do kompilacji:

[[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’ 

również nie skompilować pod IDEOne, jednak to nie skompilować pod Aktualizacja MSVC 2012 1.

Odpowiedz

26

It is not implemented in gcc 4.7.2.

Istnieją pewne wyjaśnienie:

prostu do wyjaśnienia trochę: to nie był niedopatrzenie. Mieliśmy problem z nieprzyjemnym w Drafcie C++ 0x Standard ze std :: pair, co w zasadzie uniemożliwiło dodanie członów emplace_ * do std :: map, std :: multimap, etc, bez zrywania istniejącego użytkownika kod. W ten sposób czekaliśmy na to, aż wszystko zostanie wyjaśnione na tym obszarze. Teraz faktycznie można pracować na tych obiektach.

Twój kod ładnie kompiluje się z gcc 4.8.0, zobacz LWS.

5

emplace() dla pojemników asocjacyjnych dodano w libstdc++ dla gcc 4.8.0, pod gcc 4.7.2 i t nie działa.

Powiązane problemy