Newsgroup: it.comp.lang.c++
Titolo: Problema con i Template e g++

Ciao a tutti e Buone Feste !!
Uso il compilatore GNU g++ 2.7.2.3 sotto Linux; quando tento di
compilare una classe come la seguente:
template<class T, int iMaxElemStack = 50> class Stack {
 private:
  T	TData[iMaxElemStack];
  int	iNumElem;
.....
};
viene generato questo errore:
stack.h:12: `iMaxElemStack' was not declared in this scope
E' un mio errore di sintassi o cosa ?
(il codice sopra l'ho preso da un libro dedicato al Borland/C++ -
vecchio - e quindi non sono sicuro che la sintassi sia compatibile con
il mio compilatore)
Saluti, UDA.
-- 
<><><><><><><><><><><><><><><><><><><><><><><><
UDA'Software
mailto:
uda.so...@iol.it
http://www.GeoCities.com/SiliconValley/Bay/2165

Uso il compilatore GNU g++ 2.7.2.3 sotto Linux; quando tento di
La sintassi che riporti piu` sotto e` corretta, ma il tuo
compilatore e` antediluviano, il che potrebbe darti dei
problemi con i template e varie altre feature del C++
Standard.  Suggerirei di passare ad egcs, equivalente
a gcc 2.9.x; lo trovi ad esempio a 
www.cygnus.com
 (so
che la distribuzione standard include esplicitamente Linux
fra le piattaforme supportate, comunque immagino che
non sara` difficile trovare rilasci binari gia` pronti;
accertati che si tratti di un egcs ragionevolmente recente,
almeno egcs 1.1).
Alex


Grazie per avermi risposto !!!
Purtroppo, da una ricerca fatta sui CD-Rom in mio possesso, risulta che
la versione piu' recente in mio possesso sia:
egcs-1.0.3a-14.i386.rpm      egcs-c++-1.0.3a-14.i386.rpm
Con il GCC non andiamo meglio perche' la 2.7.2.3 e', anch'essa, la piu'
recente a mia disposizione.
Dato che mi hai consigliato di procurarmi ALMENO la 1.1 ho evitato di
installare quella citata sopra anche perche', mi e' sembrato di capire
(da msg letti su altri NG), che puo' dare problemi durante la fase di
Compilazione del Kernel (ogni tanto mi capita di doverlo compilare
...); se c'e' qualcuno che mi puo' smentire questo dubbio mi fa un
piacere (forse e' un po' OT) (;-)
Saluti e Auguri, UDA.

piacere (forse e' un po' OT) (;-)
I kernel 2.0.x hanno certi bug, che gcc 2.7 (e, mi pare, 2.8)
mascherano, ma egcs (1.0 _e successivi_) fanno invece
risaltare; il problema non dovrebbe esserci con kernel 2.1
recenti, o qualsiasi kernel 2.2 (egcs dovrebbe essere il
compilatore di riferimento per questi kernel piu` nuovi).
Se non puoi cambiare kernel, ti consiglio di scaricare ed
istallare un egcs recente "accanto" al vecchio gcc da tenere
li` solo per eventuali ricompilazioni del kernel vecchio.
Alex

 li` solo per eventuali ricompilazioni del kernel vecchio.
Oppure usare gcc 2.7 per il C ed egcs per il C++, come fanno
alcune distribuzioni. Il gcc 2.7 rimane sempre un buon 
compilatore C, e il kernel e' scritto completamente in C quindi
se l'egcs viene usato solo per C++ non crea problemi.
	Mauro

 Alex
Grazie ancora per la disponibilita'.
Saluti, UDA.

  g++ -o stack main.cc stack.o
Devi compilare anche main.cc prima di linkare entrambi i moduli.
La sequenza corretta dovrebbe essere:
g++ -c -o stack.o stack.cc
g++ -c -o main.o main.cc
g++ -o main main.o stack.o
_________________________________________
Roberto Gerola
e-mail: 
roge...@tin.it
www: 
http://space.tin.it/computer/rgerola

 www: 
http://space.tin.it/computer/rgerola
Avevo gia' provato una mossa del genere; il mio makefile e' il seguente:
# makefile del programma stack
stack:main.o stack.o
        g++ -o stack main.o stack.o
main.o:main.cc
        g++ -c -o main.o main.cc
stack.o:stack.cc stack.h
        g++ -c -o stack.o stack.cc
Io ho cercato nel man del compilatore (sia gcc, prima, che egcs ora) ma
non ho trovato nulla.
Volendo potrei fregarmente ed includere il .CC anziche' il .H
(quest'ultimo e' gia' incluso nel .CC, quindi, la Dichiarazione della
Classe viene vista ugualmente nel main) dato che funziona comunque .....
ma non mi sembra una soluzione "Pulita".
Grazie per la risposta, UDA.

ma non mi sembra una soluzione "Pulita".
E` l'unica soluzione _portabile_ (come Lippman e Lajoie
spiegano assai bene nell'apposito capitolo del loro primer
sul modello di compilazione dei template).  Lo standard
prevede la possibilita` che la implementazione di un dato
template sia dichiarata "export" (hanno introdotto questa
keyword apposta!), ma, che io sappia, nessuno ancora lo
implementa su questo specifico punto.
Alex