Hi David, For the time being, one must use the standard Streamer for a TClonesArray containing classes with templates. Add one line modification to your code as shown below Rene Brun David Chamont wrote: > > Hi rooters, > > I would like to understand why the program below does not work. > So to be able to collect in a TClonesArray some non-TObject objects > (TString in the example below), I use a template which transform the > class T into a TObject via double inheritance. When I write and reread > the TClonesArray, it seems to lose the data. Any idea ? > > David C. > > =================================================== > the file with the template > =================================================== > > #include <TObject.h> > > template <class T> > class RtObj : public TObject, public T > { > public: > RtObj() {} > RtObj( const T & val ) : T(val) {} > ClassDefT(RtObj,1) > } ; > > ClassDefT2(RtObj,T) > > ClassImpT(RtObj,T) > > =================================================== > the linkdef file > =================================================== > > #ifdef __CINT__ > > #pragma link off all globals; > #pragma link off all classes; > #pragma link off all functions; > > #pragma link C++ class RtObj<TString>+; > > #endif > > =================================================== > the main file > =================================================== > > int main() > { > // begin > TROOT rdummy("dummy","dummy") ; > > // write > TFile * file = new TFile("RtObj.root","recreate") ; > TClonesArray array("RtObj<TString>",2) ; array.BypassStreamer(kFALSE); //<==========ADD THIS LINE > new (array[0]) RtObj<TString>("hello") ; > new (array[1]) RtObj<TString>(" world") ; > cout > <<"write: " > <<*((RtObj<TString> *)(array[0])) > <<*((RtObj<TString> *)(array[1])) > <<endl ; > array.Write("clones",TObject::kSingleKey) ; > file->Close() ; > delete file ; > > // read > file = new TFile("RtObj.root","read") ; > TClonesArray * parray = (TClonesArray *)(file->Get("clones")) ; > cout > <<"read: " > <<*((RtObj<TString> *)((*parray)[0])) > <<*((RtObj<TString> *)((*parray)[1])) > <<endl ; > file->Close() ; > delete file ; > > // end > return 0 ; > }
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:47 MET