Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Il nuovo top di gamma vivo punta su un comparto fotografico particolarmente articolato, con un teleobiettivo da 200 megapixel e teleconvertitori esterni capaci di arrivare a 400 mm equivalenti. Lo abbiamo provato a Tenerife, mettendo alla prova fotocamere, prestazioni, autonomia e accessori. Ecco come si è comportato.
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à
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


Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
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...
La febbre dei data center fa impennare i...
ECOVACS T90S OMNI crolla a 499€ su Amazo...
In Cina i camion elettrici hanno gi&agra...
Attacchi hacker ai supermercati in Europ...
I datacenter non piacciono? OpenAI prova...
Cupra Raval sfida BMW, Volvo e le altre:...
BYD supera per la prima volta le 300.000...
Crisi RAM, spunta un prezzo incredibile ...
Ginux, un nuovo kernel compatibile con L...
Gemini Notebook si aggiorna: arrivano i ...
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...
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: 16:49.


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