Newsgroup: it.comp.lang.c++
Titolo: errore nel compilare template

Salve,
è parecchio tempo che non lavoro più in C++. E sono un po' arrugginito.
Allora, sto facendo normale manutenzione di una libreria in C++. Oltre a fare il 
porting della stessa da unix v5 alpha a fedora 6. Nello stesso tempo, è cambiata 
anche al versione del compilatore g++, dalla 3.3.2 alla 4.1.1.
Il mio problema è dovuto all'uso di template in nested namespace. Ovvero prima 
compilava ed adesso no!!!
file: CProdotto.h (definisce il template che voglio usare)
namespace radar{
	namespace nsTemplate {
		template <typename T>
		class CRadarFiles;
		template <typename T>
		class CProdotto  : public std::vector<T> {}
          }
}
file: Utility.h (qua uso la classe CProdotto)
template <class T>
vector<T> AddVectors(const vector<T> &obj1, const nsTemplate::CProdotto<T> 
&obj2) { ... };	
Il compilatore mi da questo errore all'interno della dichiarazione di 
AddVectors(...):
Utility.h:531: error: expected ‘,’ or ‘...’ before ‘::’ token
Utility.h:531: error: ISO C++ forbids declaration of ‘nsTemplate’ with no type
Quindi, se ho capito bene non riconosce il namespace nsTemplate.
Potete darmi un aiutino ?? Sono tre anni che non lavoro più in C++ e non riesco 
a venirne fuori!
Grazie,
Obelix.

 Obelix.
Sempre sugli AS400?

 Sempre sugli AS400?
No adesso lavoro in java

 
Secondo me non riconosce il namespace nsTemplate interno a radar. Ma non ne 
capisco il motivo!

 No adesso lavoro in java
Non dirmi che sei finito nel mondo windows.

 Non dirmi che sei finito nel mondo windows.
Ho paura che ti stai riferendo ad un Obelix diverso... Se ho rubato il nick a 
qualcuno dimmelo che lo cambio.
Ciao.

 
Era proprio un problema di ordine degli include... c...o!!!!!!
Ciao, e grazie dell'aiuto.

 qualcuno dimmelo che lo cambio.
Parlo di un obelix che frequentava it.comp.os.dibattiti ere geologiche fa.
Direi che puoi tranquillamente continuarlo ad usarlo, basta che non ti
metti a postare sui ng di as400 :-)

 &obj2) { ... };
                    ^
Qua il punto e virgola non ci va.
E il namespace radar che fine ha fatto? O usi
radar::nsTemplate::CProdotto<T> o anteponi 'using namespace radar' .
Tra parentesi ereditare da std::vector non mi pare una buona idea.
Ciao,
Nicola

 Tra parentesi ereditare da std::vector non mi pare una buona idea.
E qui come al solito divento curioso...
Perche' dici cio'?
  bye & Thanks
	av.


Il rischio piu' immediato sta nel fatto che dal momento che std::vector
non ha distruttore virtuale codice come il seguente causa comportamento
indefinito:
class A : public std::vector<int> {};
std::vector<int> * pv = new A;
delete pv;
Questo pero' e' un esempio eclatante di un problema piu' generale: non
e' mai opportuno derivare da una classe che non e' stata disegnata
apposta per questo. Ad esempio cosi' facendo esponi la tua classe ad
essere utilizzata come argomento per funzioni che prendono std::vector,
senza poter garantire che la tua classe sia usata correttamente.
D'altra parte poiche' std::vector non ha funzioni membro virtuali,
quindi non hai modo di forzare il comportamento che desideri.
Un'esposizione piu' estesa di questo argomento si trova al punto 35 di
"C++ Coding Standards", di H. Sutter e A. Alexandrescu.
Ciao,
Nicola

 apposta per questo.
Ogni classe dovrebbe essere "chiusa" (non derivabile) per default.
Kiuhnm

Ogni classe dovrebbe essere "chiusa" (non derivabile) per default.
Perché?