PDA

Visualizza la versione completa : [C++] Template Class e tipo di ritorno nei metodi


Ifrit
19-10-2011, 21:28
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 (http://www.tutorialpc.it/cplus13.asp)

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



template < class TInfo >
class TList
{
public:
TList();
~TList();
void Store(TInfo& Object);
/* ... */

private:
class TCell
{
public:
TCell(TInfo& Object, TCell* Next);
~TCell();
TInfo& GetObject();
TCell* GetNextCell();
private:
TInfo& StoredObject;
TCell* NextCell;
};

TCell* FirstCell;
};



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:


template < class TInfo >
TList<TInfo>::TCell* TList < TInfo >::TCell::GetNextCell()
{
return NextCell;
}


Vado a compilare e mi viene fuori:


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 :mame:

shodan
19-10-2011, 22:15
Leggi appena più sotto, dove c'è il paragrafo: La keyword typename

Ifrit
19-10-2011, 22:57
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 :dhò: :

Riscrivendo la classe con l'accorgimento appena citato:

template < typename TInfo >
class TList
{
public:
// .... //
private:
class TCell
{
public:
// .... //
TCell* GetNextCell();
private:
// .... //
};
// .... //

};


e il relativo metodo:

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:

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:

TList<TInfo> = Template;
TCell* = Puntatore alla Classe TCell

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

Qualcuno mi illumina pls?

shodan
19-10-2011, 23:18
Per il compilatore:


template < typename TInfo >

o


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:


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:


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.

Ifrit
19-10-2011, 23:45
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 ^^

Loading