我正在研究一个应该代表图表的程序。我的问题在于我的printAdjacencyList函数。基本上,我有一个Graph ADT,它有一个成员变量“nodes”,它是该图的节点的映射。每个节点都有一组Edge *连接到它的边缘。我正在尝试迭代图中的每个节点和节点的每个边缘。
void MyGraph::printAdjacencyList() {
std::map<std::string, MyNode*>::iterator mit;
std::set<MyEdge*>::iterator sit;
for (mit = nodes.begin(); mit != nodes.end(); mit++ ) {
std::cout << mit->first << ": {";
const std::set<MyEdge*> edges = mit->second->getEdges();
for (sit = edges.begin(); sit != edges.end(); sit++) {
std::pair<MyNode*, MyNode*> edgeNodes = *sit->getEndpoints();
}
}
std::cout << " }" << std::endl;
}
getEdges声明为:
const std::set<MyEdge*>& getEdges() { return edges; };
并获取Endpoints声明为:
const std::pair<MyNode*, MyNode*>& getEndpoints() { return nodes; };
我得到的编译器错误是:
MyGraph.cpp:63: error: request for member `getEndpoints' in
`*(&sit)->std::_Rb_tree_const_iterator<_Tp>::operator->
[with _Tp = MyEdge*]()', which is of non-class type `MyEdge* const'
MyGraph.cpp:63: warning: unused variable 'edgeNodes'
我已经发现这可能意味着我在某处误用了const,但我无法弄清楚我的生活在哪里。任何信息,将不胜感激。谢谢!
答案 0 :(得分:5)
尝试将sit
更改为const_iterator
。当你在它时,也会将mit
更改为const_iterator
。此外,getEdges()
和getEndpoints()
应为const functions。最后,由于operator->()
的优先级高于一元operator*()
,因此您可能希望在内部循环中说edgeNodes = (*sit)->getEndPoints()
。
没有那么多问题,但你应该考虑将迭代器实例作为循环的本地实例。
答案 1 :(得分:2)
如果没有可编译的内容,很难说清楚,但是
const std::set<MyEdge*>& getEdges() { return edges; };
和
const std::pair<MyNode*, MyNode*>& getEndpoints() { return nodes; };
在技术上应该是const方法,因为它们不修改类并返回const引用。
const std::set<MyEdge*>& getEdges() const { return edges; };
const std::pair<MyNode*, MyNode*>& getEndpoints() const { return nodes; };
这与const_iterator
结合使用可能会解决您的常量问题。
但是,您的特定错误可能是*it->foo()
= *(it->foo())
与(*it)->foo()
不同
答案 2 :(得分:1)
s/std::set<MyEdge*>::iterator sit;/std::set<MyEdge*>::const_iterator sit;/
和mit一样。换句话说,const_iterator
就是你需要的。