Ошибка c ++: передача 'const std :: vector <Node>' в качестве аргумента 'this' отбрасывает квалификаторы [-fpermissive] - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть эта ошибка, когда я пытаюсь вставить объект в набор stl vector, Node - это класс, который я создал.Explain Не могли бы вы объяснить мне, как решить эту ошибку?

Код:

void car::expandnode(Node& current_node,std::set<vector<Node> >& closed_list,grid& map){

    int c_a = current_node.get_x();
    int c_b= current_node.get_y();

    if((map.get(c_a,++c_b))!=1){

        point p(c_a,++c_b);
       Node ns(p,costtan);

       costtan= 1+ heuristic1(ns); // cost to arrive node

       if(std::find((*closed_list.end()).begin(),(*closed_list.end()).end(),ns)==((*closed_list.end()).end()))
                closed_list.end()->push_back(ns); //error

     }


float car::heuristic1(Nodo& successor){
        int c1= successor.get_x();
        int c2= successor.get_y();
        float result = sqrt(pow((c1-destination_point_.get_x()),2) + pow((c2-destination_point_.get_y()),2));

        return resultado;

    }

Ошибка:

 error: passing ‘const std::vector<Node>’ as ‘this’ argument discards qualifiers [-fpermissive]
                 closed_list.end()->push_back(ns);

Спасибо

РЕДАКТИРОВАТЬ1:

IЯ реализую алгоритм A star, поэтому в функции expandnode, если преемник не является препятствием (!=1), я вставляю его в set из vector, этот набор содержит узлы-преемники каждого узла, я добавилбольше кода к вопросу, чтобы уточнить мои сомнения

Поскольку я вызываю expandnode() из другой функции (основной функции A-star), мне нужно вставить преемники каждого узла в последний вектор set, я использую .end() для этой цели, потому что изначально у каждого вектора есть один узел, однажды был сделан вызов expandnode(), у этого вектора есть узел и его преемники

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Другая проблема состоит в том, что все элементы в set упорядочены оператором < по умолчанию.Вы можете переопределить это.

0 голосов
/ 14 ноября 2018

closed_list является std::set. Объекты, хранящиеся в set, являются константными объектами, поскольку их изменение может потенциально изменить порядок сортировки измененного объекта по отношению к другим объектам в set.

Когда вы разыменовываете итератор set, вы получаете ссылку const &. Когда вы затем попытаетесь вызвать push_back для этого объекта, компилятор выдаст ошибку, потому что push_back не может быть вызван для const объекта.

Другая проблема с кодом состоит в том, что итератор end любого стандартного контейнера не может быть разыменован, и это приводит к неопределенному поведению. Возможно, вы хотели использовать back() вместо этого, который возвращает ссылку на последний элемент в контейнере?

Это все еще не решит проблему изменения объекта в наборе. Для этого вам нужно удалить объект из набора, изменить его, а затем снова вставить измененный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...