This happens with root_v4.02.00. I also noticed that MakeClass() generates erroneous code in this case. Calling t->MakeClass("C") produces (in the generated header file) class C { public : // Declaration of leave types C *plot_my_i.; Int_t plot_my_i_B<void>_i; C *against_my_i.; Int_t against_my_i_B<void>_i; // List of branches TBranch *b_plot_my_i_B<void>_i; //! TBranch *b_against_my_i_B<void>_i; //! }; It appears, in fact, that Tree::MakeClass always produces illegal code when the class has been branched with a trailing dot on the branch name, templates or not: struct C { int i; }; void makeclass() { C c, *cp(&c); TTree *t = new TTree("mytree", "foo", 10000); t->Branch("my_c.", "C", &cp); t->Fill(); t->MakeClass("C"); } This produces a C.h that contains C *my_c.; Thanks, troy .d straszheim troy d. straszheim writes: > > Hi roottalk: > > I'm trying to compare some classes in trees. This code shows the problem: > > #include <TTree.h> > #include <TFile.h> > > template <class T> > struct B { int i; }; > > struct C : B<void> { }; > > void plot_my_i() > { > C c, *cp(&c); > > TTree *t = new TTree("mytree", "Icecube", 10000); > > t->Branch("plot_my_i.", "C", &cp); > t->Branch("against_my_i.", "C", &cp); > > for (int i=0; i<100; i++) > { > c.i=i*13; > t->Fill(); > } > t->Draw("plot_my_i.B<void>.i:against_my_i.B<void>.i"); > t->StartViewer(); > } > > So when a class further up in the inheritance hierarchy is a template, > the angle-brackets get into the branch path, the treeplayer sees them > as comparisions and things dont work. I have tried intermediate > typedefs to outsmart rootcint: > > template <class T> struct B { int i; }; > typedef B<void> B_void; > struct C : B_void { }; > > but rootcint goes around them and the typedeffed name does not appear > in the branch path. Any ideas? > > Thanks, > > troy d. straszheim >
This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:10 MET