Newsgroup: it.comp.lang.c++
Titolo: Maneggiare typedef con template

Vorrei sapere se e' possibile effettuare una dichiarazione typedef di questo 
tipo
template<class T> class A<T>;
template<class T> class B<T>;
typedef A< B<T> >        C<T>;
Quest' ultima riga da' errore pero' si capisce qual' e' il mio intento. Non 
riesco a trovare esempi o documentazione su un utilizzo del typedef di 
questo tipo su classi template. C' e' qualcuno che conosce la soluzione 
oppure ha gia' affrontato il problema ?
Ciao, Denis.

Non e' possibile. Non esistono i typedef parametrici.
Ciao,
Nicola

Nicola Musatti wrote:

uhm, visto che conosci l'argomento, mi son trovato in un caso 
circa analogo a quello chiesto, e mi compila (vecchio VC++ M$ 
del 98):
dichiaro un typedef DENTRO una classe template, e diventa un 
membro della classe già differenziata per dichiarare da fuori 
variabili senza ricordare la sintassi piuttosto lunga
tipo
template <class T, unsigned X> class Contenitore (
	....
	typedef Sottoclasse <T, X> DeclOggetto;
	DeclOggetto Var [X];
	....
	DeclOggetto & operator [] (unsigned Index) ....
);
e da fuori consente di fare cose tipo (ma ho solo compilato il 
pezzo, mai linkato ! ! quindi potrebbe crollare tutto in 
seguito, non saprei)
Contenitore <float, 10> Obj;
Obj.DeclOggetto Var;
Var = Obj [3];
è solo una scorciatoia, non ha reale necessità di utilizzo, ma 
mi chiedo come mai in compilazione non mi crea problemi.
In effetti la typedef interna non presuppone parametrizzazione 
"di chiamata", ma i significati dei due parametri dovrebbero 
essere conosciuti da dentro il template, e nella sintassi di 
chiamata del typedef non è mai necessario specificare nessun 
parametro, poiché in realtà è pregenerata una famiglia di 
typedef, ciascuno adatto all'oggetto speficico istanziato .... 
non so, è una ipotesi in realtà.
ciao
Soviet-Mario

 Obj.DeclOggetto Var;
Questa sintassi non e' valida, devi scrivere:
Contenitore <float, 10>::DeclOggetto Var;
Ciao,
Nicola


Soviet Mario mi ha fatto ricordare che il modo piu' comune di
approssimare cio' che vuoi e' di scrivere qualcosa come
template <class T> struct C {
  typedef A< B<T> > type;
};
C<int>::type c;
Ciao,
Nicola

 inconsistenza che poi viene rilevata dal linker, come temevo ?
La sintassi che hai usato e' illegale per i typedef contenuti in una
classe. Il compilatore che stai usando era famoso per essere uno di
quelli meno conformi allo standard C++ tra i suoi coetanei ed e' anche,
informaticamente parlando, antidiluviano.
Ciao,
Nicola

 quelli meno conformi allo standard C++ 
ohi ohi !
Mi piacerebbe cambiare ambiente, in effetti, ma non ho mai 
scoperto se esista qualcosa di freeware che supporti il 
comidissimo INTELLISENSE, dal quale sono ormai dipendente.
Sai se esiste qualcosa di simile, che NON sia l'elefantiaca 
infrastruttura "dot net" ?
Altra cosa, ne approfitto per chiedertela anche se non 
appartiene al thread
esiste un modo standard, pulito, per includere piů volte (in 
punti differenti del codice), uno stesso header parametrico che 
usi defines globali, ed abbia l'effetto di una sorta di 
generatore di template (a cui i parametri "di stato", delle 
define globali, vengano passati implicitamente avendole definite 
subito prima della direttiva include, e subito dopo undefined in 
modo da poter iterare il processo ....
Ho studiato un po' la libreria BOOST ... ma non la trovo agevole 
da digerire e la tentazione di fare a mano mi rimane sempre 
ogniqualvolta non comprendo bene il funzionamento di qualcosa
grazie in anticipo
CCCP++Mario



In effetti e' un' alternativa che avevo preso in considerazione e 
probabilmente e' il massimo che si puo' ottenere.
Anche nelle Boost vengono utilizzati tipi come questo per mantenere una 
piena generici e risolvere anche il problema che ho riportato. L' unica 
pecca e' che bisogna riscrivere il codice e dove eventualmente prima si 
utilizzava un C<int> utilizzare un C<int>::type .
Ciao, Denis.