Newsgroup: it.comp.lang.c++
Titolo: Linux e templates

Domanda: funzionano i template sotto OS Linux? sono standard? oppure
devo farne a meno?
Grazie a chiunque mi sappia illuminare su sto fatto!
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 devo farne a meno?
Il sistema operativo non c'entra nulla. I 'template' sono un costrutto del
C++, ed è semmai il compilatore (non Linux o Windows) che potrà essere più
o meno conforme allo Standard nell'implementazione. La versione più recente
del GCC è molto aderente allo Standard, e ovviamente consente l'impiego dei
template (cosa per altro possibile, con diversi tipi di limitazioni, sin da
versioni molto più vecchie di quella attuale).
Max

Ok, grazie, volevo solo sapere perche' non riuscivo a capire l'errore
che mi da':
Io ho una cosa del genere
template <class T, typename K>
struct NodeKernel{
	NodeKernel(T * data = 0, const K key = 0) : pData(data), kKey(key){ }
	T * pData;
	K kKey;
	};
template <class T, typename K>
struct Node : public NodeKernel<T, K>{
	Node(T * data = 0, K key = 0, Node<T, K> * next = 0) : pnNext(next){
		pData = data;
		kKey = key;
		}
	Node<T, K> * pnNext;
	};
e mi da' degli errori del tipo:
"Nodes.h", line 25.17: 1540-1225 (W) Name lookup did not find "pData" in
the context of the template definition.
"Nodes.h", line 25.17: 1540-1226 (I) Declarations for non-dependent
names are resolved in the template definition.
"Nodes.h", line 25.17: 1540-1227 (I) "pData" does not depend on a
template argument.
"Nodes.h", line 26.17: 1540-1225 (W) Name lookup did not find "kKey" in
the context of the template definition.
"Nodes.h", line 26.17: 1540-1226 (I) Declarations for non-dependent
names are resolved in the template definition.
"Nodes.h", line 26.17: 1540-1227 (I) "kKey" does not depend on a
template argument.
...
Uso il compilatore mpcc su IBM RS/6000 SP (macchina parallela)..


 	};
A questo punto, la compilazione va a buon fine, con il mio g++. I 
template hanno tutta una serie di loro regole particolari, molte delle 
quali sfuggono pure a me, quindi puo' benissimo darsi che quella che ti 
ho dato non sia "la" soluzione.
Cmq sarebbe meglio e piu' pulito:
template <class T, typename K>
struct Node : public NodeKernel<T, K>
{
   Node(T * data = 0, K key = 0, Node<T, K> * next = 0)
     : NodeKernel<T, K>(data, key), pnNext(next)
   {
   }
   Node<T, K> * pnNext;
};
Salut!
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Linux registered user 299762 @ Linux registered machine 213003

 		kKey = key;
pData e kKey sono membri privati di NodeKernel, quindi non ci puoi
accedere da Node (e comunque non ha senso usare l'assegnamento nel
corpo del costruttore).
Probabilmente ti serviva:
  explicit Node(T * data = 0, K key = 0, Node<T, K> * next = 0)
    : NodeKernel<T, K>(data, key), pnNext(next)
  {
  }
        Mauro

 accedere da Node
 > [CUT]
Beh, NodeKernel e' stato dichiarato come struct, quindi tutti i suoi 
membri sono pubblici di default.


 
Bisogna riconoscere che, almeno per chi ha dimesticheza con le 
problematiche dei template, i messaggi d'errore di questo compilatore, in 
questo caso, sono piuttosto eloquenti. Il GCC 3.4.1 in questo caso 
emette un semplice
  error: `pData' undeclared (first use this function) 
Max

 codice compila.
Anche con this->pData che, secondo me, è più leggibile.
Ciao.
-- 
BSD is for UNIX lovers -- linux is for Windows haters.

Altri ti hanno gia' spiegato, comunque RTFM:
http://gcc.gnu.org/gcc-3.4/changes.html#cplusplus
Ciao,
Nicola

 
http://gcc.gnu.org/gcc-3.4/changes.html#cplusplus
Che tra l'altro conferma che anche gli sviluppatori del g++ pensano che 
sia meglio la soluzione col this-> piuttosto che quella col 
NodeKernel<T, K>::
