Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Nelle ultime settimane abbiamo provato il mouse Logitech G305, la tastiera G316 X 98 e le cuffie G325. Si tratta del setup entry-level di Logitech che ormai, di "entry-level" ha ben poco. Tastiera e mouse offrono prestazioni di livello competitivo con quasi nessuna rinuncia e un livello di personalizzazione estremamente elevato. Le cuffie, invece, hanno mostrato qualche debolezza, ma propongono un ventaglio di funzionalità completo che consente di abbandonare completamente i cavi
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
POCO F9 Pro arriva sul mercato con l'obiettivo di portare prestazioni da smartphone top di gamma in una fascia di prezzo "più aggressiva", senza rinunciare a un comparto fotografico finalmente all'altezza. Dopo averlo testato sul campo, emerge uno smartphone molto più completo rispetto alla generazione precedente, ma anche con alcuni piccoli compromessi che diventano difficili da ignorare quando il prezzo di listino sfiora i 1.000 euro.
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI
Snapdragon Soung Gen 2 è la piattaforma Qualcomm per i dispositivi audio sempre più integrati nel mondo dell'intelligenza artificiale: al prorpio interno tanta potenza elaborativa per gestire al meglio le necessità d'uso dell'agentic AI
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-09-2008, 21: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 21:12.
innaig86 è offline   Rispondi citando il messaggio o parte di esso
Old 26-09-2008, 11: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, 12: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, 12: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, 17: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, 21: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, 21: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, 21: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


Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Eni mette un tetto ai prezzi dei carbura...
BYD Seagull (Dolphin Surf), l'elettrica ...
Multa milionaria per un data center del ...
F-Droid 2.0 si aggiorna con una nuova gr...
Microsoft ridisegna Copilot: dalla chat ...
Volkswagen porterà 20 videogiochi...
Troppa IA storpia: OpenAI licenzia in tr...
Marathon, Bungie svela i contenuti dell'...
Autunno, tempo di potature: i tagliasiep...
Meta Muse, due sviluppatori riescono a o...
Google AI Pro gratis: festa a sorpresa p...
MacSync colpisce macOS usando i calendar...
L'agente IA cancella 48 mila file in 103...
Jensen Huang avverte: l'AI può aiutare a...
Elettrico Renault in arrivo in Spagna: 6...
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: 18:52.


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