C ++错误:将“ const std :: vector <node>”作为“ this”参数传递会舍弃限定符[-fpermissive]

时间:2018-11-14 01:42:32

标签: c++ object compilation iterator set

当我尝试将对象插入一组stl vector中时出现此错误,Node是我创建的类。 ¿您能向我解释如何解决此错误吗?

代码:

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);

谢谢

EDIT1:

我正在实现A star算法,因此如果后继程序不是障碍(!=1),则在函数expandnode中,我将其插入set的{​​{1}}中包含每个节点的后继节点,我在问题中添加了更多代码以澄清我的疑问

由于我要从其他函数(主要A-star函数)调用vector,因此我需要在expandnode()的最后一个向量上插入每个节点的后继字符,因此我使用{{1} }的目的,因为最初每个向量都有一个节点,所以一旦调用set,此向量就有该节点及其后继对象

2 个答案:

答案 0 :(得分:2)

closed_liststd::set。存储在set中的对象是const对象,因为修改它们可能会改变修改后的对象相对于set中其他对象的排序方式。

当取消引用set的迭代器时,您获得的引用是const &。然后,当您尝试在该对象上调用push_back时,编译器会生成错误,因为无法在push_back对象上调用const

该代码的另一个问题是任何标准容器的end迭代器都是不可引用的,并且这样做会导致未定义行为。也许您是想使用back()来返回容器中最后一个项目的引用?

这仍然无法解决修改集合中对象的问题。为此,您需要从集合中删除对象,对其进行修改,然后重新插入修改后的对象。

答案 1 :(得分:1)

另一个问题是,set中的所有元素默认情况下都由运算符<进行排序。您可能需要覆盖它。