Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有自定义值类型的map::emplace()_C++_Gcc_C++11_Gcc4.7 - Fatal编程技术网

C++ 具有自定义值类型的map::emplace()

C++ 具有自定义值类型的map::emplace(),c++,gcc,c++11,gcc4.7,C++,Gcc,C++11,Gcc4.7,我在使用map::emplace()时遇到问题。有人能帮我找出正确的语法吗?实际上,我正在尝试做与中相同的事情。以下是我的版本: #include <map> using namespace std; class Foo { // private members public: Foo(int, char, char) /* :init(), members() */ { } // no default ctor, copy ctor, move ct

我在使用
map::emplace()
时遇到问题。有人能帮我找出正确的语法吗?实际上,我正在尝试做与中相同的事情。以下是我的版本:

#include <map>
using namespace std;

class Foo
{
  // private members

  public:
    Foo(int, char, char) /* :init(), members() */ {  }

    // no default ctor, copy ctor, move ctor, or assignment
    Foo() = delete;
    Foo(const Foo&) = delete;
    Foo(Foo &&) = delete;
    Foo & operator=(const Foo &) = delete;
    Foo & operator=(Foo &&) = delete;
};


int main()
{
  map<int, Foo> mymap;
  mymap.emplace(5, 5, 'a', 'b');

  return 0;
}
#包括
使用名称空间std;
福班
{
//私人成员
公众:
Foo(int,char,char)/*:init(),members()*/{}
//无默认ctor、复制ctor、移动ctor或赋值
Foo()=删除;
Foo(const Foo&)=删除;
Foo(Foo&&)=删除;
Foo&运算符=(const Foo&)=删除;
Foo&运算符=(Foo&&)=删除;
};
int main()
{
地图我的地图;
mymap.emplace(5,5,'a','b');
返回0;
}

在GCC4.7(带有
-std=c++11
标志)下,我在
安置
行出错。没有说明如何处理自定义类型而不是原语。

GCC4.7不完全支持
emplace
函数


您可以在GCC4.7.2中看到对C++11的支持。

容器的
emplace
成员使用提供的参数构造元素

映射的
value\u type
std::pair
,并且该类型没有使用参数
{5,5,'a',b'}
的构造函数,即,这不起作用:

std::pair<const int, Foo> value{ 5, 5, 'a', 'b' };
map.emplace(value);

但是GCC4.7也不支持这种语法(GCC4.8发布后会支持这种语法)。

我很担心。我尝试的语法是否正确?也就是说,它能在其他编译器上工作吗?另外,
emplace()
可以与
map
一起工作,就像在cplusplus.com示例中一样。@SchighSchagh您可能需要
转发作为元组,我不确定,因为我从未使用过
emplace
。这是调用不能工作的一个合理原因。事实上,您有另一个并不是向下投票的理由。链接的文档已经过时,GCC主干(该页面所指)确实支持
map::emplace
,GCC 4.7的正确链接是,即使在GCC 4.7上,它似乎也可以正常工作。谢谢FWIW,我使用了
std::forward_as_tuple()
而不是
std::make_tuple()
,因为我认为它应该稍微优化一些,但我不确定区别是什么。
forward_as_tuple(5,'a','b')
创建
tuple
make_tuple(5,'a','b')
创建
tuple
。通常,
forward\u as\u tuple
避免复制其参数并转发引用,但在这种情况下(使用
int
char
参数),
make\u tuple
创建的副本可能比创建引用便宜。它的输入也更少:)对于C++17,
map.try_emplace(5,5,'a','b')
;也可以使用。另请参见
mymap.emplace(std::piecewise_construct, std::make_tuple(5), std::make_tuple(5, 'a', 'b'));