std::set没有成员函数emplace。

24

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 Update 1下可以通过编译。

2个回答

26

在gcc 4.7.2中未实现。

有一些解释:

  

只是想澄清一下:这不是一个 疏忽 。在草案C ++ 0x标准中,std :: pair存在一个讨嫌且严重的问题,这基本上使得添加emplace_*成员到std :: map,std :: multimap等变得不可能,而不破坏现有的用户代码。因此,我们等待,直到在这整个区域内澄清了事情。现在可以实际工作于这些设施。

您的代码可以在gcc 4.8.0下编译成功,请参见LWS


5

emplace() 是关联式容器中在 gcc 4.8.0 的 libstdc++ 中新增的函数,在 gcc 4.7.2 中该函数无法使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接