Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-09-2008, 22:07   #1
innaig86
Senior Member
 
Iscritto dal: Jan 2007
Città: Trani
Messaggi: 1772
[C++] Dichiarazione anticipata con classe template - problema

Salve, ho un problema che vorrei esporvi. Ho fatto diverse prove e credo di aver individuato la causa.

Il codice è questo:

Codice:
#ifndef LISTA_PUNTATORI_H
#define LISTA_PUNTATORI_H



template <typename T> class Lista_puntatori {

// blocco di interesse---------------------
struct nodo {
   T elemento;
   nodo * successivo;
   nodo * precedente;
}; 

typedef nodo * posizione;

//fine blocco di interesse------------------

public:
      
   Lista_puntatori();
   ~Lista_puntatori();
   
   void creaLista();
   void insLista(T, posizione);
   void scriviLista(T, posizione);
   void cancLista(posizione);
   
   bool listaVuota();
   bool fineLista(posizione);
   
   posizione primoLista();
   posizione succLista(posizione);
   posizione precLista(posizione);
   
   T leggiLista(posizione);
   
private:
   posizione primo;
};


template <class T> Lista_puntatori<T>::Lista_puntatori(){
   creaLista();
};

template <class T> Lista_puntatori<T>::~Lista_puntatori(){
   posizione p;
   while (primo != NULL){
      p = primo;
      primo = primo->successivo;
      delete p;
   }         
};

template <class T> void Lista_puntatori<T>::creaLista(){
   primo = NULL;
};

template <class T> void Lista_puntatori<T>::insLista(T elem, posizione p){
   posizione temp;
   temp->elemento = elem;
   temp->successivo = p;
   
   if (primo == p){
      temp->precedente = NULL;
      primo = temp;          
   } else {
     temp->precedente = p->precedente;
     precLista(p)->successivo = temp;
     p->precedente = temp;
   }      
};

template <class T> void Lista_puntatori<T>::scriviLista(T elem, posizione p){
   if ((primo != NULL) && (p != NULL)){
      p->elemento = elem;
   }
};

template <class T> void Lista_puntatori<T>::cancLista(posizione p){
   if ((p != NULL) && (primo != NULL)){
      precLista(p)->successivo = p->successivo;
      succLista(p)->precedente = p->precedente;
      delete p;
   }
};

template <class T> bool Lista_puntatori<T>::listaVuota(){
   return (primo == NULL);
};


template <class T> bool Lista_puntatori<T>::fineLista(posizione p){
   return (p == NULL);
};

template <class T> posizione Lista_puntatori<T>::primoLista(){
   return primo;         
};

template <class T> posizione Lista_puntatori<T>::succLista(posizione p){
   if (p != NULL)
      return p->successivo;
    else 
       return NULL;
};

template <class T> posizione Lista_puntatori<T>::precLista(posizione p){
   if (p != NULL)
      return p->precedente;
    else 
       return NULL;
};

template <class T> T Lista_puntatori<T>::leggiLista(posizione p){
      if (p != NULL)
      return p->elemento;
    else 
       return NULL;
};

#endif
Il problema principale è: in fase di compilazione, mi da errore "expected constructor, destructor, or type conversion before "Lista_puntatori"" e "expected ';' before "Lista_puntatori"" sulle righe 98, 102, e 108, che sono le implementazioni delle funzioni primoLista(), succLista() e precLista().

Per quanto ne ho capito, il problema deriva dalla definizione di "posizione" (infatti tutte quelle funzioni dovrebbero restituire un dato di tipo posizione).
La causa dovrebbe essere il fatto che nodo e posizione sono definiti dopo la dichiarazione della classe (dopo la 3a riga in pratica, commentato come "blocco di interesse"), mentre dovrebbero essere posizionati prima della 3a riga.

Per risolvere questo problema, ho provato a portare il "blocco di interesse" prima della 3a riga.
Il risultato è che, giustamente, lì non sa ancora cos'è T (utilizzata nello struct) e quindi se provo in quest'altro modo dà errore: 'T' does not name a type.

Codice:
#ifndef LISTA_PUNTATORI_H
#define LISTA_PUNTATORI_H

// blocco di interesse---------------------
struct nodo {
   T elemento;
   nodo * successivo;
   nodo * precedente;
}; 

typedef nodo * posizione;

//fine blocco di interesse------------------


template <typename T> class Lista_puntatori {
Per far conoscere T in quel punto, dovrei fare una dichiarazione anticipata della classe, ma anche se provo a fare:
Codice:
#ifndef LISTA_PUNTATORI_H
#define LISTA_PUNTATORI_H
template <typename T> class Lista_puntatori;
// blocco di interesse---------------------
struct nodo {
   T elemento;
   nodo * successivo;
   nodo * precedente;
}; 

typedef nodo * posizione;

//fine blocco di interesse------------------


template <typename T> class Lista_puntatori {
mi dice sempre 'T' does not name a type.

Ora, come potrei fare per far funzionare sto codice?
Avete qualche idea?

Grazie.
__________________
Compravendite:serpone, canta, edema, ErodeGrigo, Baccus, Carbv, Siemens2007, Dragon2002, peppequo, xdaf, Macerf900 + tante altre....

Ultima modifica di innaig86 : 25-09-2008 alle 22:12.
innaig86 è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2008, 12:12   #2
innaig86
Senior Member
 
Iscritto dal: Jan 2007
Città: Trani
Messaggi: 1772
up
__________________
Compravendite:serpone, canta, edema, ErodeGrigo, Baccus, Carbv, Siemens2007, Dragon2002, peppequo, xdaf, Macerf900 + tante altre....
innaig86 è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2008, 13:38   #3
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Perchè non fare una classe template Nodo?
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2008, 13:43   #4
innaig86
Senior Member
 
Iscritto dal: Jan 2007
Città: Trani
Messaggi: 1772
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Perchè non fare una classe template Nodo?
Ci avevo pensato e ho provato poco fa: stesso errore
__________________
Compravendite:serpone, canta, edema, ErodeGrigo, Baccus, Carbv, Siemens2007, Dragon2002, peppequo, xdaf, Macerf900 + tante altre....
innaig86 è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2008, 18:19   #5
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Ciao,

prova così:

Codice:
...
template <class T> typename Lista_puntatori<T>::posizione Lista_puntatori<T>::primoLista(){
   return primo;         
};

template <class T> typename Lista_puntatori<T>::posizione Lista_puntatori<T>::succLista(posizione p){
   if (p != NULL)
      return p->successivo;
    else 
       return NULL;
};

template <class T> typename Lista_puntatori<T>::posizione Lista_puntatori<T>::precLista(posizione p){
   if (p != NULL)
      return p->precedente;
    else 
       return NULL;
};
...
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 27-09-2008, 22:14   #6
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Be' scusa ma così definisci una struct dentro la definizione di una classe, è consentito? Io abbozzerei qualcosa del genere:
Codice:
template <typename T>
{
  struct nodo
  {
    T elemento;
    struct nodo *successivo;
    struct nodo *precedente;
  };
  typedef struct nodo *posizione;

  class ListaPuntatori
  {
    /* ... */
  };
}
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 27-09-2008, 22:52   #7
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Codice:
  typedef struct nodo *posizione;
si trova all'interno della dichiarazione della classe, quando sei fuori dalla stessa il compilatore giustamente non sa cosa sia 'posizione'. Devi essere esplicito ed indicare in che classe si trova.
Se nelle righe incriminate sostituisci
Codice:
posizione
con
Codice:
typename Lista_puntatory<T>::posizione
dovresti risolvere i tuoi problemi.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 27-09-2008, 22:54   #8
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
ops. ho visto dopo che ti ha gia' risposto correttamente Vincenzo
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Nella capsula Orion di Artemis II ci sar...
L'immagine del mese del telescopio spazi...
Heatspreader originale al posto del wate...
Ubisoft ha definitivamente archiviato Wa...
Motivair by Schneider Electric presenta ...
Un dissipatore che non richiede energia ...
Con Maia 200 Microsoft alza l'asticella ...
La Cina impone requisiti anche per lo st...
Apple lancia AirTag aggiornato: range es...
Microsoft risolve i blocchi di Outlook: ...
OpenAI verso il disastro finanziario? L’...
X nei guai: l'UE indaga sui pericoli del...
Caso Corona-Signorini: il giudice blocca...
470 petaFLOPS con una frequenza di 56 GH...
WhatsApp: abbonamento per rimuovere la p...
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: 22:05.


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