在gdb中使用带有无序_映射的[]运算符给出未解析运算符 我有一个C++代码,我在这里实例化一个无序的映射,然后用CUT打印它的值。这个很好用。但是,当我试图在gdb中运行这个程序并打印无序的_映射的值时,这会给我带来错误。下面是代码片段: std::unordered_map<std::string,int> mymap = { { "Mars", 3000}, { "Saturn", 60000}, { "Jupiter", 70000 } }; std::cout<< mymap.at("Mars"); std::cout<< mymap["Mars"];

在gdb中使用带有无序_映射的[]运算符给出未解析运算符 我有一个C++代码,我在这里实例化一个无序的映射,然后用CUT打印它的值。这个很好用。但是,当我试图在gdb中运行这个程序并打印无序的_映射的值时,这会给我带来错误。下面是代码片段: std::unordered_map<std::string,int> mymap = { { "Mars", 3000}, { "Saturn", 60000}, { "Jupiter", 70000 } }; std::cout<< mymap.at("Mars"); std::cout<< mymap["Mars"];,c++,c++11,gdb,unordered-map,C++,C++11,Gdb,Unordered Map,您面临的问题是std::无序\u map::at(key) 需要类型为std::string,而不是const char*literal的键。这意味着 在将其传递给at()之前,您希望创建一个临时std::string对象 从GDB中创建一个临时对象对我来说不太合适,我可能会 遗漏了一些东西,但这是我得到的: (gdb) p std::string("Mars") A syntax error in expression, near `"Mars")'. (gdb) p 'std::basic_

您面临的问题是
std::无序\u map::at(key)
需要类型为
std::string
,而不是
const char*
literal的键。这意味着 在将其传递给
at()
之前,您希望创建一个临时std::string对象

从GDB中创建一个临时对象对我来说不太合适,我可能会 遗漏了一些东西,但这是我得到的:

(gdb) p std::string("Mars")
A syntax error in expression, near `"Mars")'.
(gdb) p 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)'("Mars")
$9 = -161888904
现在一切都正常了:

(gdb) p mymap.at(make_string("Mars"))
$1 = (std::unordered_map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, int> > >::mapped_type &) @0x60005e5f0: 3000
(gdb) p mymap.at(make_string("Jupiter"))
[New Thread 14608.0x16f4]
$2 = (std::unordered_map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, int> > >::mapped_type &) @0x60005e650: 70000
这不起作用,因为它从未被实例化。您的代码是通过以下方式实例化的:

std::cout<< mymap["Mars"];
这样,调试就成为可能:

print mymap.at(make_string("Jupiter"))
print mymap[make_string("Jupiter")]

只是工作。

我也注意到了这一点。GDB似乎解决了重载操作符的问题,并且它经常不能找到常用的函数相关定义-查找漂亮的PrimTrink的其他答案。GDB不是C++编译器,因此尽管它知道很多C++,但它没有内置的所有C++规则。(在这种情况下,它似乎无法想象它应该从字符串文本创建一个std::string临时对象,然后解决映射的适当重载)感谢您的回复。根据评论,我不应该尝试使用无序的_映射打印操作符[]。相反,我可以在gdb.Related中使用print mymap打印映射的所有成员。
(gdb) p mymap.at(make_string("Mars"))
$1 = (std::unordered_map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, int> > >::mapped_type &) @0x60005e5f0: 3000
(gdb) p mymap.at(make_string("Jupiter"))
[New Thread 14608.0x16f4]
$2 = (std::unordered_map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, int> > >::mapped_type &) @0x60005e650: 70000
(gdb) p mymap[make_string("Jupiter")]
Could not find operator[].
std::cout<< mymap["Mars"];
std::string make_string(const char *x)
{
        return x;
}

int main()
{
 std::unordered_map<std::string,int> mymap = {
                      { "Mars", 3000},
                      { "Saturn", 60000},
                      { "Jupiter", 70000 } };

    std::string mars{"Mars"};
    std::cout<< mymap.at(mars);
    std::cout<< mymap[mars];
}
print mymap.at(make_string("Jupiter"))
print mymap[make_string("Jupiter")]