【问题标题】:cpp map as function parameter get warning info "discards qualifiers"c ++ map作为函数参数获取警告信息“丢弃限定符”
【发布时间】:2013-12-26 13:40:08
【问题描述】:

使用 CPP 地图,从 Eclipse 编辑器获取警告信息。

Point find_shortest_node(const vector<Point> &openset,const   map<Point, int> &f_score,const map<Point, vector<int> > &f_direction) {

vector<Point>::iterator iner_iterator = openset.begin();
Point min_point = *iner_iterator;
while (iner_iterator != openset.end()) {
    if (f_score[*iner_iterator] < f_score[min_point]) {
        min_point = *iner_iterator;
    } 
        else if (f_score[*iner_iterator] == f_score[min_point]) {
            vector<int> temp1 = f_direction[*iner_iterator], temp2 =f_direction[min_point];
            if (temp1.size() < temp2.size()) {
            min_point = *iner_iterator;
            continue;
        }
    }
    iner_iterator++;
}
return min_point;

}

警告信息:

传递 'const std::map' 作为 '_Tp& std::map<_key _tp _alloc>::operator[](const _KT&) 的 'this' 参数 [with _KT = Point, _Key = Point , _Tp = int,_Compare = std::less, _Alloc = std::allocator >]'丢弃限定符[-fpermissive]

【问题讨论】:

  • 我没有在您的代码中看到声明为 constmap 引用,但我仍然怀疑这是问题 stackoverflow.com/questions/1474894/…
  • 看起来很可疑,您在发布此内容时从第二个参数之前删除了 const 关键字。你确定你的真实代码中没有const吗?

标签: c++ map


【解决方案1】:

出于某种原因,Eclipse 认为f_scoreconst。根据您的声明,它不是const,所以这看起来像是Eclipse 的编辑器的问题。

如果你有一个 C++11 兼容的编译器,你可以通过使用 map::at 而不是方括号 [] 运算符来解决这个问题,如下所示:

while (iner_iterator != openset.end()) {
    if (f_score.at(*iner_iterator) < f_score.at(min_point)) {
        min_point = *iner_iterator;
    } else if (f_score.at(*iner_iterator) == f_score.at(min_point)) {
            vector<int> temp1 = f_direction.at(*iner_iterator), temp2 =f_direction.at(min_point);
            if (temp1.size() < temp2.size()) {
            min_point = *iner_iterator;
            continue;
        }
    }
    iner_iterator++;
}

【讨论】:

    【解决方案2】:

    最简单的解决办法是替换

    f_score[something]
    

    f_score.find(something)->second
    

    这适用于const 引用,因为当找不到something 时它不会创建新元素。不过,您应该检查是否确实找到了该元素:

    map<Point, int>::const_iterator it = f_score.find(something);
    if (it != f_score.end()) {
        // ok, something was found
    } else {
        // element not found
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2011-03-19
      • 2011-10-13
      • 2014-02-07
      • 2017-06-15
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多