Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Ifrit
    Registrato dal
    Oct 2005
    Messaggi
    116

    [C++] Template Class e Tipo di ritorno nei Metodi

    Salve a tutti ^^
    Da qualche giorno mi sono messo a studiare il C++, e ora sono arrivato ai template.
    Studiano qui e li, stavo "approfondendo" qui: Link

    Allora, nella spiegazione/esercizio viene costruito il seguente template:

    Codice PHP:
    template < class TInfo >
    class 
    TList
       
    {
       public:
          
    TList();
          ~
    TList();
          
    void Store(TInfoObject);
          
    /* ... */

       
    private:
          class 
    TCell
             
    {
             public:
                
    TCell(TInfoObjectTCellNext);
                ~
    TCell();
                
    TInfoGetObject();
                
    TCellGetNextCell();
             private:
                
    TInfoStoredObject;
                
    TCellNextCell;
             };

          
    TCellFirstCell;
       }; 
    codice:
    nota:
    Non ho ben capito perche' il riferimento a TInfo e' fatto mediante la & :X 
    O sono io che non ho ben capito cosa indica tale forma in questo contesto, 
    o ci andrebbe TInfo*... ma vabe', il problema non e' quello...
    Vado a costruire i metodi, e riporto solo quello che mi da rogne:
    Codice PHP:
    template < class TInfo >
    TList<TInfo>::TCell*  TList TInfo >::TCell::GetNextCell()
       {
          return 
    NextCell;
       } 
    Vado a compilare e mi viene fuori:
    codice:
    C:\...\template.h:46: error: expected constructor, destructor, or type conversion before '*' token
    (e' scontato, ma lo dico cmq... la linea 46 e' quella in cui c'e' la testa del metodo)

    Ora, per come e' costruita la classe dovrebbe essere tutto ok O.o'
    Il tipo di ritorno e': TList <TInfo>::TCell *
    O.o no?

    Qualcuno , mi saprebbe illuminare pls?

    grazie in anticipo
    codice:
     $(".canaglia").show()

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Leggi appena più sotto, dove c'è il paragrafo: La keyword typename
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it L'avatar di Ifrit
    Registrato dal
    Oct 2005
    Messaggi
    116
    Originariamente inviato da shodan
    Leggi appena più sotto, dove c'è il paragrafo: La keyword typename
    Per prima cosa grazie per avermi risposto

    Per cio' che ne concerne la keyword typename, beh mi si sono chiarite molte cose.
    In qualsiasi caso non capisco una cosa, la scrivo cosi magari qualcuno puo' spiegarmela :

    Riscrivendo la classe con l'accorgimento appena citato:
    Codice PHP:
    template typename TInfo >
    class 
    TList
       
    {
       public:
           
    // ....  //
       
    private:
          class 
    TCell
             
    {
             public:
                  
    // ....  //
                
    TCellGetNextCell();
             private:
                
    // ....  //
             
    };
         
    // ....  //

       
    }; 
    e il relativo metodo:
    Codice PHP:
    template typename TInfo >
    TList<TInfo>::TCell*  TList TInfo >::TCell::GetNextCell()
       {
          return 
    NextCell;
       } 
    Continua a darmi lo stesso problema O.o'

    Funziona invece se il metodo lo scrivo cosi:
    Codice PHP:
    template typename TInfo >
    typename TList<TInfo>::TCell*  TList TInfo >::TCell::GetNextCell()
       {
          return 
    NextCell;
       } 
    Ma... perche'?? O.o' Una volta detto che TInfo e' un identificatore di tipo abbiamo:
    1. TList<TInfo> = Template;
    2. TCell* = Puntatore alla Classe TCell

    Non vedo il perche' il compilatore capista altro O.o''

    Qualcuno mi illumina pls?
    codice:
     $(".canaglia").show()

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Per il compilatore:
    codice:
    template < typename TInfo >
    o
    codice:
    template < class TInfo >
    è la stessa cosa in questo contesto.
    Diciamo che typename rende di più l'idea che TInfo sia un dato qualsiasi e non strettamente una classe. Alcuni usano class, altri typename. De gustibus.

    Dove cambia però è qui:
    codice:
    template < typename TInfo >
    TList<TInfo>::TCell*  TList < TInfo >::TCell::GetNextCell()
       {
          return NextCell;
       }
    Qui il compilatore non può sapere se TCell è da considerare una variabile o un tipo di dato. E poco importa se glielo metti come tipo di ritorno: il compilatore continuerà a chiederselo finché non gli specificherai che TCell è un tipo di dato, usando la keyword typename
    Per inciso, la definizione corretta sarebbe:
    codice:
    template < typename TInfo >
    inline  typename TList<TInfo>::TCell*  TList < TInfo >::TCell::GetNextCell()
       {
          return NextCell;
       }
    o appena userai questo template in più di una unità di compilazione sarà il linker a protestare.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it L'avatar di Ifrit
    Registrato dal
    Oct 2005
    Messaggi
    116
    grazie infinite ^^

    non ti nascondo che non e' che la questione mi sia poi tanto chiara =)
    TCell e' una classe, e pertanto se ritorno a TCell* non vedo come la cosa puo' creare ambiguita'... deve tornare a un puntatore di tale classe O.o

    Vabe' ^^ grazie comunque ^^
    codice:
     $(".canaglia").show()

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.