我无法在以下C ++程序中检测到错误。 该代码定义了Graph类。
#include <vector>
#include <list>
using namespace std;
class Neighbor {
public:
int node_id;
float edge_cost;
float price;
Neighbor(int&,float&,float&);
};
Neighbor::Neighbor(int& node_id, float& edge_cost,float& price) {
this->node_id = node_id;
this->edge_cost = edge_cost;
this->price = price;
}
template <class NS>
class Graph {
private:
vector<list<NS> > adjacency_list;
vector<list<NS> >::iterator node_iterator;
public:
void add(int node_id, Neighbor& neighbor);
void remove(int node_id, Neighbor& neighbor);
Graph();
};
template <class NS>
Graph<NS>::Graph() {
node_iterator = adjacency_list.begin();
}
template <class NS>
void Graph<NS>::add(int node_id, Neighbor& neighbor) {
if(adjacency_list.size()<node_id){
while(adjacency_list.size()<node_id)
adjacency_list.pushback(list<NS>());
}
adjacency_list[node_id].push_back(neighbor);
}
template <class NS>
void Graph<NS>::remove(int node_id,Neighbor& neighbor) {
if(adjacency_list.size()<node_id)
return;
adjacency_list[node_id].remove(neighbor);
}
当我编译它时,我收到以下错误:
max_flow.cpp:21:错误:输入'std :: vector&gt;,std :: allocator&gt; &GT; &gt;'不是从'Graph'类型派生的 max_flow.cpp:21:错误:预期';'在'node_iterator'之前 max_flow.cpp:在构造函数'Graph :: Graph()'中: max_flow.cpp:31:错误:'node_iterator'未在此范围内声明
vector :: iterator有效。但为什么不矢量&gt; :: iterator?
谢谢!
答案 0 :(得分:3)
尝试使用typename
:
typename vector<list<NS> >::iterator node_iterator;
答案 1 :(得分:2)
尝试替换
中的代码行vector<list<NS> >::iterator node_iterator;
到
typename vector<list<NS> >::iterator node_iterator;
如果要将它用作Graph的模板参数,还需要为Neighbor类实现copy-constructor。这是因为您手动定义了Neighbor构造函数,这会禁用编译器生成的复制构造函数。
你还需要定义Neighbor :: operator ==,因为你在graph中使用了vector :: remove方法,这需要operator ==的item item。
实际上,为了检查所有编译错误,您可以对模板使用显式实例化:
template class Graph<Neighbor>;
还有一个smaaaaaaall错误是以下行
adjacency_list.pushback(list<NS>());
应替换为
adjacency_list.push_back(list<NS>());
答案 2 :(得分:0)
也许尝试typedef你的矢量。通常很好的做法是使用你使用的类型的typedef。
typedef vector<list<NS> > node;
然后
node::iterator