【问题标题】:c++ error: passing ‘const std::vector<Node>’ as ‘this’ argument discards qualifiers [-fpermissive]c++ 错误:将“const std::vector<Node>”作为“this”参数传递会丢弃限定符 [-fpermissive]
【发布时间】:2018-11-14 01:42:31
【问题描述】:

当我尝试将一个对象插入一组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星算法,所以在函数expandnode中如果后继者不是障碍物(!=1),我将它插入到vectorset中,这个集合包含每个后继节点节点,我在问题中添加了更多代码以澄清我的疑问

因为我从其他函数(主要 A-star 函数)调用 expandnode(),我需要在 set 的最后一个向量上插入每个节点的后继,为此我使用 .end(),因为最初每个向量都有一个节点,一旦调用expandnode(),这个向量就有节点及其后继节点

【问题讨论】:

  • closed_list.end()-&gt;push_back(ns); -- 你到底想用那行代码完成什么?不管是什么,那段代码都做不到。
  • 取消引用 .end() 是未定义的行为,因为它仅充当占位符。它指向最后一个元素。
  • *closed_list.end() -- 您可以在多个地方执行此操作。这是完全错误的(取消引用 end() 迭代器)。所以你应该说明你想用这些行做什么。
  • @PaulMcKenzie 我编辑了问题
  • @AER 集合的最后一个元素是closed_list.rbegin()。取消引用 end() 是未定义的行为。

标签: c++ object compilation iterator set


【解决方案1】:

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

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

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

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

【讨论】:

  • rbegin() 获取指向集合最后一个元素的迭代器。
【解决方案2】:

另一个问题是set 中的所有元素默认由运算符&lt; 排序。您可能想要覆盖它。

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多