B

#### Brice Rebsamen

vector<xxx>::iterator j;

the compiler reports

error: expected `;' before ‘j’

error: ‘j’ was not declared in this scope

The odd thing is that it does not fail all the time. For instance I

was using it without any problem while developing a Graph class. When

I modified the class to use templates for vertices and edges, I got

this problem.

I am declaring a side class Link<Vertice,Edge> and I want to use an

iterator on a vector of Link:

vector< Link<Vertice,Edge> >::iterator j;

Here is the exact code: See function remove

#include <vector>

using std::vector;

template <typename Vertice, typename Edge>

class Link {

public:

Edge *edge;

Vertice *vertice;

Link(Vertice *v=0, Edge *e=0) : vertice(v), edge(e) { }

};

template <typename Vertice, typename Edge>

class Node {

public:

Vertice *vertice;

vector< Link<Vertice,Edge> > links;

Node(Vertice *v=0) : vertice(v) { }

};

template <typename Vertice, typename Edge=int>

class Graph {

public:

virtual ~Graph() { }

void add(Vertice *v, Vertice *w=0, Edge *e=0);

void remove(Vertice *v);

void clear();

private:

vector< Node<Vertice,Edge> > nodes;

int searchVertice(const Vertice *v) const;

void get_routes(Tree<const Vertice *> &routes, const Vertice *end)

const;

};

template <typename Vertice, typename Edge>

int Graph<Vertice,Edge>::searchVertice(const Vertice *v) const {

for( int i=0; i<nodes.size(); i++ )

if( nodes

*.vertice==v )*

return i;

return -1;

}

template <typename Vertice, typename Edge>

void Graph<Vertice,Edge>::add(Vertice *v, Vertice *w, Edge *e) {

int v_index = searchVertice(v);

if( v_index==-1 ) {

nodes.push_back(Node<Vertice,Edge>(v));

v_index = nodes.size()-1;

}

if( w!=0 ) {

int w_index = searchVertice(w);

if( w_index==-1 && w!=0 ) {

nodes.push_back(Node<Vertice,Edge>(w));

w_index = nodes.size()-1;

}

// link v & w with e

nodes[w_index].links.push_back(Link<Vertice,Edge>(v,e));

nodes[v_index].links.push_back(Link<Vertice,Edge>(w,e));

}

}

template <typename Vertice, typename Edge>

void Graph<Vertice,Edge>::remove(Vertice *v) {

int v_index = searchVertice(v);

if( v_index==-1 ) return;

vector< Link<Vertice,Edge> > & links = nodes[v_index].links;

//this is where the problem is

vector< Link<Vertice,Edge> >::iterator j;

for( j=links.begin(); j<links.end(); j++ ){

//for each connected node remove the connection to this node

Vertice *w = j->vertice;

int w_index = searchVertice(w);

if( w_index!=-1 ) {

vector< Link<Vertice,Edge> > & linksW = nodes[w_index].links;

vector< Link<Vertice,Edge> >::iterator l;

for( l=linksW.begin(); l<linksW.end(); l++ ) {

if( l->vertice==v ) {

linksW.erase(l);

}

}

}

//then delete the edge

if( j->edge ) delete j->edge;

//finally remove the link

links.erase(j);

}

}

return i;

return -1;

}

template <typename Vertice, typename Edge>

void Graph<Vertice,Edge>::add(Vertice *v, Vertice *w, Edge *e) {

int v_index = searchVertice(v);

if( v_index==-1 ) {

nodes.push_back(Node<Vertice,Edge>(v));

v_index = nodes.size()-1;

}

if( w!=0 ) {

int w_index = searchVertice(w);

if( w_index==-1 && w!=0 ) {

nodes.push_back(Node<Vertice,Edge>(w));

w_index = nodes.size()-1;

}

// link v & w with e

nodes[w_index].links.push_back(Link<Vertice,Edge>(v,e));

nodes[v_index].links.push_back(Link<Vertice,Edge>(w,e));

}

}

template <typename Vertice, typename Edge>

void Graph<Vertice,Edge>::remove(Vertice *v) {

int v_index = searchVertice(v);

if( v_index==-1 ) return;

vector< Link<Vertice,Edge> > & links = nodes[v_index].links;

//this is where the problem is

vector< Link<Vertice,Edge> >::iterator j;

for( j=links.begin(); j<links.end(); j++ ){

//for each connected node remove the connection to this node

Vertice *w = j->vertice;

int w_index = searchVertice(w);

if( w_index!=-1 ) {

vector< Link<Vertice,Edge> > & linksW = nodes[w_index].links;

vector< Link<Vertice,Edge> >::iterator l;

for( l=linksW.begin(); l<linksW.end(); l++ ) {

if( l->vertice==v ) {

linksW.erase(l);

}

}

}

//then delete the edge

if( j->edge ) delete j->edge;

//finally remove the link

links.erase(j);

}

}