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