尝试创建字符串映射并插入项将导致无法理解的错误喷射

attempting to create a string map and insert items results in incomprehensible error spew

本文关键字:错误 字符串 创建 映射 插入      更新时间:2023-10-16

我想创建一个简单的地图,像这样:

                std::map<const std::string, const std::string> mymap;
                mymap.insert("foo", "bar");

当我尝试这个时,我得到这个错误:

In file included from /usr/include/c++/4.8.2/map:60:0,
                 from /home/me/dev/some-project/blocks/mycompany/some-project/main.cpp:11:
/usr/include/c++/4.8.2/bits/stl_tree.h: In instantiation of ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique_(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator, _Arg&&) [with _Arg = const char&; _Key = const std::basic_string<char>; _Val = std::pair<const std::basic_string<char>, const std::basic_string<char> >; _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char>, const std::basic_string<char> > >; _Compare = std::less<const std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, const std::basic_string<char> > >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, const std::basic_string<char> > >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, const std::basic_string<char> > >]’:
/usr/include/c++/4.8.2/bits/stl_tree.h:1722:37:   required from ‘void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(_II, _II) [with _InputIterator = const char*; _Key = const std::basic_string<char>; _Val = std::pair<const std::basic_string<char>, const std::basic_string<char> >; _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char>, const std::basic_string<char> > >; _Compare = std::less<const std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, const std::basic_string<char> > >]’
/usr/include/c++/4.8.2/bits/stl_map.h:671:11:   required from ‘void std::map<_Key, _Tp, _Compare, _Alloc>::insert(_InputIterator, _InputIterator) [with _InputIterator = const char*; _Key = const std::basic_string<char>; _Tp = const std::basic_string<char>; _Compare = std::less<const std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, const std::basic_string<char> > >]’
/home/me/dev/some-project/blocks/mycompany/some-project/main.cpp:38:57:   required from here
/usr/include/c++/4.8.2/bits/stl_tree.h:1478:63: error: no match for call to ‘(std::_Select1st<std::pair<const std::basic_string<char>, const std::basic_string<char> > >) (const char&)’
  = _M_get_insert_hint_unique_pos(__position, _KeyOfValue()(__v));
                                                               ^
In file included from /usr/include/c++/4.8.2/string:48:0,
                 from /usr/include/c++/4.8.2/bits/locale_classes.h:40,
                 from /usr/include/c++/4.8.2/bits/ios_base.h:41,
                 from /usr/include/c++/4.8.2/ios:42,
                 from /usr/include/c++/4.8.2/ostream:38,
                 from /usr/include/c++/4.8.2/iostream:39,
                 from /home/me/dev/some-project/blocks/mycompany/some-project/main.cpp:10:
/usr/include/c++/4.8.2/bits/stl_function.h:486:12: note: candidates are:
     struct _Select1st
            ^...

它一直在继续,但是我不能从错误输出中判断出问题是什么。

我不能粘贴它的其余部分,因为stackoverflow说我有太多的代码和没有足够的文本

这不是在c++中使用std::map<..>::insert的方式。您应该插入std::pair<std::string,std::string>(std::string("a"), std::string("b"))。参见任意c++参考。

您可能不使用std::string("a"),因为有一个std::string构造函数接受C字符串。

当你应该使用emplace()operator[]时,你正在使用insert()。但是,在使用operator[]时不能使用const std::string

std::map<std::string, std::string> mymap;
mymap["foo"] = "bar";

如果你真的想使用insert()const std::string,你必须插入一个std::pair<const std::string, const std::string>

std::map<const std::string, const std::string> mymap;
std::pair<const std::string,const std::string> p("foo", "bar");
mymap.insert(p);

还有c++ 11的方法,使用初始化列表:

std::map<const std::string, const std::string> mymap;
mymap.insert({ "foo", "bar" });

您可以使用insertstd::pair插入到地图中。

mymap.insert(std::pair<const std::string, const std::string>("a", "b"));