Newsgroup: it.comp.lang.c++
Titolo: Problema con i template.

Ciao, chiedo aiuto a voi guru del c++, dato che ho un problema con i
template.
La situazione è la seguente:
############ FILE GTWUTIL.h ##############
template <class PERMIT,class LSFILE,class TXN_01_def, class MARKETST>
class GatewayUtil
{
public:
  virtual RWCString getMarketCode(MARKETST& mktst) =0;
[...]
};
############### FILE MYGTWUTIL.H ####################
template<class PERMIT, class LSFILE, class TXN_01_def, class MARKETST>
class MyGtwUtil : public GatewayUtil <PERMIT, LSFILE, TXN_01_def, MARKETST>
{
public:
  virtual RWCString getMarketCode(MARKETST& mktst);
[...]
};
template<class PERMIT, class LSFILE, class TXN_01_def, class MARKETST>
RWCString MyGtwUtil< PERMIT, LSFILE, TXN_01_def,
MARKETST>::getMarketCode(MARKETST& mktst)
{
  return (mktst.getMktStatusCode());
};
Ora in un altra classe ( per dirla tutta è una classe che deriva da un
template) chiamata Gateway ho un attributo del tipo:
                     GatewayUtil<PERMIT, LSFILE, TXN_01_def,MARKETST>*
gtwUtil;
che istanzio fornendo i parametri del template corretti.
Il programma va in crash quando in uno dei metodi della classe Gateway
eseguo la chiamata:
                     marketStatusCode = gtwUtil->getMarketCode( (*I));
debaggando sembra che per una qualche motivo non venga trovato ed eseguito
il metodo corrispondente del template MyGtwUtil.
Sono sicuro che il problema non è nel codice eseguito da getMarketCode in
quato ho provato a dare una implementazione banale è il problema rimane.
Sono anche sicuro della correttezza del parametro di ingresso.
Qualcuno ha idea di cosa ho sbagliato???
Ciao e grazie, Ripa.
PS
Utilizzo un cross compiler c++ in ambiente NT per piattaforma Tandem.

 template.
Nel codice che hai postato non mi sembra ci sia nulla di sbagliato.
Verifica che gli header GTWUTIL.h e MYGTWUTIL.H laddove istanzi la classe da
assegnare a:
GatewayUtil<PERMIT, LSFILE, TXN_01_def,MARKETST>* gtwUtil;
e laddove fai la chiamata fatidica.
Verifia che PERMIT, LSFILE, TXN_01_def, MARKETST siano classi o tipi definiti
con typedef (non delle macro definite con #define). Lo dico perche' di solito si
usano le lettere maiuscole per le macro, anche se non e' certo obbligatorio.
Verifica con il debugger che gtwUtil sia un puntatore valido e che, dopo aver
instanziato l'oggetto non ci sia stato qualche invoontario "passaggio per il
distruttore" (significherebbe che hai distrutto l'oggetto senza riassegnare il
puntatore a 0.)
Al punto in cui esegui:
marketStatusCode = gtwUtil->getMarketCode( (*I));
verifica che I non sia una macro ma che sia dichiarata come
MARKETST *I;
e che contenga un indirizzo valido. Al limite prova a riscrivere la riga come:
marketStatusCode = I->getMktStatusCode();
marketStatusCode = gtwUtil->getMarketCode( (*I));
e verificare che il crash avvenga solo nella seconda chiamata.
Se tutto sembra ancora Ok prova a postare il codice in cui istanzi e assegni a
gtwUtil.
Puoi anche provare a definire un body rendendo la virtuale non pura e verificare
che non venga chiamato mettendoci un breakpoint (e se viene chiamato, verifica
lo stato della memoria e dello stack al momento del breakpoint per vedere se
l'oggetto e' effettivamente del tipo giusto e verificando che non sia in fase di
costruzione/distruzione).
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556