std::set не имеет члена emplace
Реализует ли g++ 4.7.2 std::set::emplace
, как определено стандартом C++11 и задокументировано здесь?
Я написал следующий маленький тестовый пример:
#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"));
}
В G++ 4.7.2 это не компилируется:
[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’
Также не удается скомпилировать в IDEOne, однако он компилируется в MSVC 2012 Update 1.
2 ответа
Это не реализовано в gcc 4.7.2.
Есть некоторое объяснение:
Просто чтобы уточнить: это не было упущением. У нас была неприятная проблема в Draft C++0x Standard с std:: pair, которая по существу делала невозможным добавление членов emplace_* в std:: map, std:: multimap и т. Д., Не нарушая существующий пользовательский код. Таким образом, мы ждали этого, пока все не прояснилось во всей этой области. Теперь на самом деле можно работать на этих объектах.
Ваш код прекрасно компилируется с помощью gcc 4.8.0, см. LWS.
emplace()
для ассоциативных контейнеров был добавлен в libstdc++
для gcc 4.8.0, под gcc 4.7.2 это не будет работать.