【问题标题】:Using [] operator with unordered_map in gdb give unresolved operator在 gdb 中使用带有 unordered_map 的 [] 运算符给出未解析的运算符
【发布时间】:2017-09-13 19:45:23
【问题描述】:

我有一个 C++ 代码,我在其中实例化一个 unordered_map,然后使用 cout 打印它的值。这工作正常。但是,当我尝试在 gdb 中运行它并打印 unordered_map 的值时,这给了我错误。下面是sn-p的代码:

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

    std::cout<< mymap.at("Mars");
    std::cout<< mymap["Mars"];

上面的两个 cout 语句都打印键“Mars”的 unordered_map 值。但是,当我使用 gdb 然后尝试使用以下语句在键“Mars”处打印 mymap 的值时,我得到了错误。

(gdb) print mymap.at("Mars")
Cannot resolve method 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> > >::at to any overloaded instance

(gdb) print mymap["Mars"]
Cannot resolve function operator[] to any overloaded instance

当我使用 gdb 时,我不明白什么是错误的。

我尝试在 gdb 中使用 whatis mymap 来查看 mymap 是否存在于当前上下文中,并且它表明它存在。另外,我尝试初始化一个 int 变量并在 gdb 中打印它并打印它。我不明白 unordered_map 有什么问题。

我正在使用下面的语句来生成可执行文件

gsrivas4@TitanX01:~/lcode1$ g++ -std=gnu++11 -O0 -g test1.cpp -o test1.out

【问题讨论】:

  • 这绝对是我注意到的。 gdb似乎在解析重载运算符时遇到问题,经常找不到常用函数的定义
  • 可能相关的stackoverflow.com/questions/34894381/… - 并在 prettyprinting 上查找其他答案。
  • gdb 不是 C++ 编译器,因此虽然它确实了解很多 C++,但它没有内置所有 C++ 规则(在这种情况下,它似乎无法确定它应该创建一个 std ::string 来自字符串文字的临时对象,然后解决映射的适当重载)
  • 感谢您的回复。基于 cmets,我不应该尝试使用 unordered_map 操作 []。相反,我可以使用 gdb 中的 print mymap 打印地图的所有成员。

标签: c++ c++11 gdb unordered-map


【解决方案1】:

你面临的问题是std::unordered_map&lt;std::string,int&gt;::at(key) 需要 std::string 类型的键,而不是 const char* 文字。这意味着 您想创建一个临时 std::string 对象,然后将其传递给at()

从 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 中构建 std::string 对象似乎是不可能的 一些额外的 C++ 代码,所以只需添加到您的 C++ 代码中:

std::string make_string(const char *x)
{
        return x;
}

现在一切正常:

(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"];

T&amp; operator[]( Key&amp;&amp; key );,很难从 GDB 调用。 如果你实例化了T&amp; operator[]( const Key&amp; key );,那么事情会 过得更好。

解决方案:在您的 C++ 代码中实例化 operator[](const std::string &amp;) 变体。所以在这里 是新代码:

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")]

只是工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2011-10-21
    • 2010-11-30
    • 2012-12-04
    • 2011-01-09
    相关资源
    最近更新 更多