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) ; 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