Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-07-2013, 19:30   #1
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
[C++] Non riesco a richiamare un metodo di una classe con template

Ho un file .h che contiene questo codice:

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.

Codice:
    //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?
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2013, 20:06   #2
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da -Ivan- Guarda i messaggi
Ho un file .h che contiene questo codice:

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.

Codice:
    //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:
Codice:
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
Codice:
a.push_back<int>(6);
ti basta scrivere
Codice:
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.

Ultima modifica di vendettaaaaa : 09-07-2013 alle 20:09.
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2013, 20:31   #3
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
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- è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2013, 21:26   #4
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
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:
Codice:
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;
}
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2013, 22:08   #5
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da -Ivan- Guarda i messaggi
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:
Codice:
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?
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 09-07-2013, 22:43   #6
-Ivan-
Senior Member
 
L'Avatar di -Ivan-
 
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1846
Quote:
Originariamente inviato da vendettaaaaa Guarda i messaggi
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:

Codice:
int result = graph->AddNode(*node);
prima era così:
Codice:
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.

Ultima modifica di -Ivan- : 10-07-2013 alle 10:06.
-Ivan- è offline   Rispondi citando il messaggio o parte di esso
Old 10-07-2013, 11:24   #7
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Quote:
Originariamente inviato da -Ivan- Guarda i messaggi
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:

Codice:
int result = graph->AddNode(*node);
prima era così:
Codice:
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
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
Svolta per l'emulazione della prima Xbox...
Narwal celebra 10 anni: l'evoluzione tec...
TIM Enterprise acquisisce il 70% di VoiS...
Altro che dicembre, la RTX 5080 da 24 GB...
Quale futuro per Mass Effect? Tutte le i...
Schermi rotti su iPhone Duo: un report s...
Lo stealer VOLTA chiede a Claude, Kimi e...
Intel e Oracle puntano sulle CPU Xeon pe...
Offerte Amazon da urlo: Mac mini M6 a 89...
Bici elettriche a prezzi da record su Am...
Il boom dell'IA fa salire i costi: HP, A...
Cloudflare: 18,2 milioni di attacchi DDo...
GeForce RTX 2080 Ti con 22 GB di VRAM: f...
Dalla padella... ai server AI: Nvidia va...
1.000 cicli e ancora il 90,4% della capa...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:29.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v