web-dev-qa-db-ja.com

std :: setにはメンバーがありません

G ++ 4.7.2は、C++ 11標準で定義され、文書化されているstd::set::emplaceを実装していますか ここ

私は次の小さなテストケースを書きました:

#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 Update1ではコンパイルされます。

24
John Dibling

gcc 4.7.2では実装されていません。

いくつかの説明があります:

少し明確にするために:これは監視ではありませんでした。 std :: pairを使用したドラフトC++ 0x標準でnastyの問題が発生しました。これにより、emplace_ *メンバーをstd ::に追加できなくなりました。 map、std :: multimapなど、既存のユーザーコードを壊すことはありません。したがって、この領域全体で物事が明らかになるまで、私たちはそれを待ちました。現在、これらの施設で実際に作業することが可能です。

コードはgcc4.8.0で適切にコンパイルされます。 [〜#〜] lws [〜#〜] を参照してください。

26
Ali

連想コンテナのemplace()がgcc4.8.0のlibstdc++に追加されましたが、gcc4.7.2では機能しません。

5
Johnny Mnemonic