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ではコンパイルされます。
いくつかの説明があります:
少し明確にするために:これは監視ではありませんでした。 std :: pairを使用したドラフトC++ 0x標準でnastyの問題が発生しました。これにより、emplace_ *メンバーをstd ::に追加できなくなりました。 map、std :: multimapなど、既存のユーザーコードを壊すことはありません。したがって、この領域全体で物事が明らかになるまで、私たちはそれを待ちました。現在、これらの施設で実際に作業することが可能です。
コードはgcc4.8.0で適切にコンパイルされます。 [〜#〜] lws [〜#〜] を参照してください。
連想コンテナのemplace()
がgcc4.8.0のlibstdc++
に追加されましたが、gcc4.7.2では機能しません。