PDA

View Full Version : [C++] Non riesco a richiamare un metodo di una classe con template


-Ivan-
09-07-2013, 19:30
Ho un file .h che contiene questo codice:


template <class node_type, class edge_type>
class Graph
{
public:
//define typedef with easy names
typedef edge_type EdgeType;
typedef node_type NodeType;

//a vector of the nodes in the graph
typedef std::vector<node_type> NodeVector;
//a double linked list of edges
typedef std::list<edge_type> EdgeList;
//Adjacency Lists representing the graph - a vector with many double linked list of edges
typedef std::vector<EdgeList> EdgeListVector;

...cose superflue

int AddNode(NodeType node);

...altre cose superflue
};

template <class node_type, class edge_type>
int Graph<node_type, edge_type>::AddNode(node_type node)
{
...
}



Ora, dal main sto cercando di dichiarare un oggetto Graph e di richiamare il metodo AddNode.
Sono arrivato a questo punto e non so come richiamare la funzione.


//istantiate a graph
Graph<GraphNode, GraphEdge> *graph = new Graph<GraphNode, GraphEdge>(false);
//create a node
GraphNode *node = new GraphNode(0);

//ERROR - expected primary expression before token
int result = graph->AddNode<GraphNode, GraphEdge>(node);



Ho provato diversi modi per richiamare la funzione ma con tutti mi da errore. Cosa sto sbagliando?

vendettaaaaa
09-07-2013, 20:06
Ho un file .h che contiene questo codice:


template <class node_type, class edge_type>
class Graph
{
public:
//define typedef with easy names
typedef edge_type EdgeType;
typedef node_type NodeType;

//a vector of the nodes in the graph
typedef std::vector<node_type> NodeVector;
//a double linked list of edges
typedef std::list<edge_type> EdgeList;
//Adjacency Lists representing the graph - a vector with many double linked list of edges
typedef std::vector<EdgeList> EdgeListVector;

...cose superflue

int AddNode(NodeType node);

...altre cose superflue
};

template <class node_type, class edge_type>
int Graph<node_type, edge_type>::AddNode(node_type node)
{
...
}



Ora, dal main sto cercando di dichiarare un oggetto Graph e di richiamare il metodo AddNode.
Sono arrivato a questo punto e non so come richiamare la funzione.


//istantiate a graph
Graph<GraphNode, GraphEdge> *graph = new Graph<GraphNode, GraphEdge>(false);
//create a node
GraphNode *node = new GraphNode(0);

//ERROR - expected primary expression before token
int result = graph->AddNode<GraphNode, GraphEdge>(node);



Ho provato diversi modi per richiamare la funzione ma con tutti mi da errore. Cosa sto sbagliando?
Analogamente al fatto che quando scrivi:
vector<int> a(5);
a.push_back(6);
tu NON specifichi i parametri del template anche per le funzioni membro che invochi su a, visto che a è già stato istanziato con int, e quindi anche tutte le sue funzioni membro, cioè NON scrivi
a.push_back<int>(6);
ti basta scrivere
int result = graph->AddNode(node);

p.s.: "expected [...] token" è un errore che significa che stai sbagliando la sintassi; infatti specificare i parametri di un template quando non serve è un errore sintattico.

-Ivan-
09-07-2013, 20:31
Grazie mille. In effetti avevo già provato a scriverlo in quel modo ma siccome mi dava comunque errore poi avevo provato altri modi. Mi accorgo ora che gli errori che da sono in altre parti del codice.

-Ivan-
09-07-2013, 21:26
Mi sono impataccato di nuovo, ho commentato completamente il codice dentro la funzione che richiamo così sono sicuro che non ci siano errori, sulla chiamata però mi da errore:

17 C:\Users\Ivan\Documents\C++ development\main.cpp invalid conversion from `GraphNode*' to `int'

Il codice è sempre questo:

int main(int argc, char *argv[])
{
//istantiate a graph
Graph<GraphNode, GraphEdge> *graph = new Graph<GraphNode, GraphEdge>(false);
//create a node
GraphNode *node = new GraphNode(0);

int result = graph->AddNode(node);
//cout << "Created Node " << result << endl;

system("PAUSE");
return EXIT_SUCCESS;
}

vendettaaaaa
09-07-2013, 22:08
Mi sono impataccato di nuovo, ho commentato completamente il codice dentro la funzione che richiamo così sono sicuro che non ci siano errori, sulla chiamata però mi da errore:

17 C:\Users\Ivan\Documents\C++ development\main.cpp invalid conversion from `GraphNode*' to `int'

Il codice è sempre questo:

int main(int argc, char *argv[])
{
//istantiate a graph
Graph<GraphNode, GraphEdge> *graph = new Graph<GraphNode, GraphEdge>(false);
//create a node
GraphNode *node = new GraphNode(0);

int result = graph->AddNode(node);
//cout << "Created Node " << result << endl;

system("PAUSE");
return EXIT_SUCCESS;
}


E qual è la riga 17?

-Ivan-
09-07-2013, 22:43
E qual è la riga 17?

Pardon, è sempre la stessa. E' la riga in cui chiamo la funzione.


EDIT: risolto

La chiamata alla funzione doveva avere il dereference sul parametro node:


int result = graph->AddNode(*node);


prima era così:

int result = graph->AddNode(node);


faccio ancora una confusione pazzesca. All'università ricordo che usavamo un sacco i doppi puntatori per i parametri delle funzioni, ora purtroppo ho ricordi molto vaghi e quando ci sono di mezzo i template mi si intrecciano i neuroni. Mi sto facendo guide su guide su internet, spero mi torni in mente quello che ho rimosso.

vendettaaaaa
10-07-2013, 11:24
Pardon, è sempre la stessa. E' la riga in cui chiamo la funzione.


EDIT: risolto

La chiamata alla funzione doveva avere il dereference sul parametro node:


int result = graph->AddNode(*node);


prima era così:

int result = graph->AddNode(node);


faccio ancora una confusione pazzesca. All'università ricordo che usavamo un sacco i doppi puntatori per i parametri delle funzioni, ora purtroppo ho ricordi molto vaghi e quando ci sono di mezzo i template mi si intrecciano i neuroni. Mi sto facendo guide su guide su internet, spero mi torni in mente quello che ho rimosso.
Ah vero, la funzione prende un NodeType e non un NodeType*.
Tranquillo cmq, pian piano tornerà tutto dolorosamente in mente :D