gpt4 book ai didi

C++ 编译器将列表转换为常量列表

转载 作者:行者123 更新时间:2023-11-27 23:17:02 26 4
gpt4 key购买 nike

这可能真的很简单,但我似乎无法解决。在我的 Vertex我有一个 std::list<Edge>但是当我尝试调用它的方法时 push_front我收到一条错误消息 listconst我不能推进它。我认为出于某种原因,编译器正在转换 std::list<Edge>const std::list<Edge> .我知道我的代码设置得不是很好,但这只是家庭作业,所以我采取了一些捷径。

头文件:

#ifndef GRAPH_H
#define GRAPH_H

#include <set>
#include <list>

class Edge{
public:
unsigned int to;
unsigned int weight;
};

class Vertex{
public:
unsigned int id;
std::list<Edge> edges;

bool operator<(const Vertex& other) const{
return id < other.id;
}
};

class Graph{

public:
void add_vertex(unsigned int id);
void add_edge(unsigned int from, unsigned int to, unsigned int weight);
std::set<Vertex> get_vertices();
std::list<Edge> get_edges(unsigned int id);

private:
std::set<Vertex> _vertices;
unsigned int size = 0;


};

导致错误的行:

void Graph::add_edge(unsigned int from, unsigned int to, unsigned int weight) 
{
Vertex find_vert;
find_vert.id = from;
set<Vertex>::iterator from_v = _vertices.find(find_vert);
Edge new_edge;
new_edge.to = to;
new_edge.weight = weight;

from_v->edges.push_front(new_edge); // ERROR HERE
}

运行时出现的编译器错误消息 g++ -c Graph.cpp :

Graph.cpp:23:38: error: passing ‘const std::list<Edge>’ as ‘this’ argument of ‘void std::list<_Tp,
_Alloc>::push_front(const value_type&) [with _Tp = Edge; _Alloc = std::allocator<Edge>; std::list<_Tp,
_Alloc>::value_type = Edge]’ discards qualifiers [-fpermissive]

最佳答案

std::set 的内容隐式为 const,因为更改内容可能会使它们的排序顺序无效。

这使得 from_v 在这里隐式地成为 const

set<Vertex>::iterator from_v = _vertices.find(find_vert);

你的错误告诉你你正在尝试修改一个 const 对象。

   from_v->edges.push_front(new_edge);
// ^^^^^^ const ^^^^^^^^^^ non-const behavior

关于C++ 编译器将列表转换为常量列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15735267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com