无法更正C ++代码中的错误

时间:2009-11-22 18:31:25

标签: c++ stl iterator

我无法在以下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?

谢谢!

3 个答案:

答案 0 :(得分:3)

尝试使用typename

    typename vector<list<NS> >::iterator node_iterator;

Here is a good reference that explains typename

答案 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