cpp map в качестве параметра функции получает информацию о предупреждении «discards qualifiers»

0

используя карту 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, _Compare, _Alloc> :: operator [] (const _KT &) [с _KT = Point, _Key = Point, _Tp = int, _Compare = std :: less, _Alloc = std :: allocator>] 'отбрасывает квалификаторы [-fpermissive]

  • 1
    Я не вижу ссылку на map объявленную как const в вашем коде, но я все еще подозреваю, что это проблема stackoverflow.com/questions/1474894/…
  • 1
    Выглядит подозрительно, как будто вы удалили ключевое слово const перед вторым аргументом при публикации этого сообщения. Вы уверены, что в вашем реальном коде нет const ?
Теги:
map

2 ответа

1

По какой-то причине Eclipse считает, что f_score является const. Согласно вашей декларации, это не const, поэтому это выглядит как проблема с редактором Eclipse.

Если у вас есть компилятор, совместимый с С++ 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++;
}
0

Самое простое решение - заменить

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
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню