Подтвердить что ты не робот

Std:: set не имеет имени пользователя

Использует ли g++ 4.7.2 std::set::emplace, как определено стандартом С++ 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 это не скомпилируется:

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

Также не удается скомпилировать под IDEOne, однако он компилируется в MSVC 2012 Update 1.

4b9b3361

Ответ 1

Он не реализован в gcc 4.7.2.

Есть несколько объяснений:

Просто немного уточнить: это был не промах. У нас было неприятное проблема в проекте С++ 0x Standard с std:: pair, которая по существу не удалось добавить членов emplace_ * в std:: map, std:: multimap и т.д., не нарушая существующий код пользователя. Таким образом, мы ждали, пока все не выяснится во всей этой области. Теперь на самом деле можно работать на этих объектах.

Ваш код легко компилируется с помощью gcc 4.8.0, см. LWS.

Ответ 2

emplace() для ассоциативных контейнеров был добавлен в libstdc++ для gcc 4.8.0, в gcc 4.7.2 он не будет работать.