【问题标题】:Watching map entries in VS debugger在 VS 调试器中查看映射条目
【发布时间】:2018-10-30 21:41:04
【问题描述】:

我想知道这是否是我的错误/误解(很可能)或其他原因。

我在 VS 2017 社区中有以下代码:

#include <map>

int main()
{
    std::map<int, int> myMap{};
    myMap[1] = 4;
    myMap[4] = 2;
    return 0;
}

现在,当我调试时,我想尝试查看我得到的地图的某些条目

    myMap[1]    no operator "[]" matches these operands

为什么会这样?我不确定。

【问题讨论】:

  • 您是否正在调试优化的构建?调试优化代码通常会令人惊讶,因为生成的代码可能与原始 C++相当不同,而且许多东西可以被优化掉并切换。尝试调试版本。
  • 它在调试配置中
  • 人们是否可以至少评论一下为什么?
  • 赌的是那些不明白你在问什么的人。我明白了。看来 Jesper 和 Caleth 明白了。而且看起来 Caleth 打字的速度比我快。

标签: c++ visual-studio debugging


【解决方案1】:

调试器将myMap 视为const。这是为了阻止你改变状态来观察它。

[] 的两个重载是

T& operator[]( const Key& key );
T& operator[]( Key&& key );

它们都不能在 const map 上调用,因为它们会插入一个默认构造条目以在 key 不存在时返回。

您可以改用at,如果key 不存在则抛出,因此有const 限定的重载

const T& at( const Key& key ) const;

【讨论】:

    【解决方案2】:

    在这里,您已将地图的名称声明为“map”。因为地图对象类型已经使用了名称“地图”,所以不能以这种方式使用它。

    如果您将地图名称更改为其他名称,例如

    std::map<int, int> myMap{}
    

    并使用该名称而不是单词“map”来调用它,您应该会看到您所期望的行为

    【讨论】:

    • 这没什么区别
    • std::mapmap 是不同的野兽。
    猜你喜欢
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2020-05-22
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 2020-07-22
    相关资源
    最近更新 更多