RE: [ROOT] namespace problem

From: Philippe Canal (pcanal@popgtw.fnal.gov)
Date: Tue Nov 21 2000 - 18:39:08 MET


Hi,

There is a very small bug that prevents the TClonesArray to properly detect the
name of the base class (if the base class is inside a namespace or another class).

There is no quick fix beside not using namespace or applying the patch below.

Philippe.

diff -r1.1.1.1 TBaseClass.cxx
83c83
<    return fInfo->Name();
---
>    return fInfo->Fullname();

> -----Original Message-----
> From: owner-roottalk@pcroot.cern.ch
> [mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of thorsten glebe
> Sent: Tuesday, November 21, 2000 9:57 AM
> To: roottalk@pcroot.cern.ch
> Subject: [ROOT] namespace problem
> 
> 
> Hello,
> 
> I have a problem using namespace. If I define two classes
> (MyClass, MyLeaf) inside a namespace (e.g. namespace TG),
> with MyLeaf inherited from MyClass, and MyClass inherited from TObject,
> then root forgets that MyLeaf is inherited from TObject, too.
> 
> MyLeaf looks fine with the .class command, but using
> the ClassDraw() command, MyLeaf looks like a base class.
> Even worse, when trying to save a MyLeaf Object-Pointer
> in a TClonesArray I get the following error:
> 
> Error in <TClonesArray::TClonesArray>: TG::MyLeaf does not inherit
> from TObject
> 
> I am using root version 2.25.03.
> 
> Is there a solution to this problem?
> 
> Goodbye,
>   Thorsten
> 
> 
> Code: (MyClass.hh)
> 
> #include <TObject.h>
> 
> namespace TG {
> 
>   class MyClass : public std::TObject {
>   public:
>     MyClass();
> 
>     int Loop();
> 
>     ClassDef(MyClass,1)
>   };
> 
> 
>   class MyLeaf : public MyClass {
>   public:
>     MyLeaf();
>     int print();
> 
>     ClassDef(MyLeaf,1)
>   };
> } // end of namespace
> 
> 
> MyClass.C:
> 
> #include <iostream>
> #include "MyClass.hh"
> 
> namespace TG {
> 
>   MyClass::MyClass() {
>     std::cout << " MyClass constructor" << endl;
>   }
> 
>   int MyClass::Loop() {
>     cout << " Myclass loop " << endl;
>     return 0;
>   }
> 
>   ClassImp(MyClass)
> 
>   MyLeaf::MyLeaf() {
>     std::cout << " MyLeaf constructor" << endl;
>   }
> 
>   int MyLeaf::print() {
>     cout << " MyLeaf loop " << endl;
>     return 0;
>   }
> 
>   ClassImp(MyLeaf)
> 
> }
> 
> 
> LinkDef.h:
> 
> #ifdef __CINT__
> 
> #pragma link off all globals;
> #pragma link off all classes;
> #pragma link off all functions;
> 
> #pragma link C++ nestedclasses;
> #pragma link C++ nestedtypedefs;
> 
> #pragma link C++ namespace TG;
> #pragma link C++ class TG::MyClass;
> #pragma link C++ class TG::MyLeaf;
> #endif
> 
> 
> ----------------------------------------------------
> Dr. Thorsten Glebe    <Thorsten.Glebe@mpi-hd.mpg.de>
> 
>         Max-Planck-Institut fuer Kernphysik
> 
> Saupfercheckweg 1                 Tel: 06221/516-631
> D-69117 Heidelberg                Fax: 06221/516-603
> ----------------------------------------------------
> 
> 
> 



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:37 MET