Re: [ROOT] adding a class which includes STL

From: Fons Rademakers (Fons.Rademakers@cern.ch)
Date: Thu Sep 05 2002 - 13:53:53 MEST


Hi Bart,

   try instead of using "unsigned" to explicit form "unsigned int".

Cheers, Fons.




On Wed, 2002-09-04 at 17:32, Bart Lode Frank VAN DE VYVER wrote:
> Hi,
> 
> I'm new to ROOT and going through the usual growing pains. What I would
> like to do is to store STL containers of objects with references between
> them, writing them from a C++ program and reading them interactively
> into ROOT.
> 
> The simplest case works quite well. Running the following
> 
> class ClassB : public TObject {
>   unsigned countB;
> public:
>   ClassB( unsigned countB =0 ) : countB(countB) {}
>   unsigned          GetCountB() const { return countB; }
>   ClassDef(ClassB,1)
> };
> 
> (with a .cc with the ClassImp) I managed to write objects of type ClassB
> to a ROOT tree, read them back in interactive root or simply instantiate
> and manipulate objects of type ClassB in interactive ROOT.
> 
> 1) STL containers of basic types
>    +++++++++++++++++++++++++++++
> Adding a data member of type vector<unsigned>, rootcint stumbles,
> typically spitting out something along the lines of
> 
> Error: Function unsigned() is not defined in current scope 
> FILE:/afs/cern.ch/sw/root/pro/@sys/root/cint/lib/prec_stl/vector
> LINE:133
> 
> I've tried putting a 
> #pragma link C++ class vector<unsigned>;
> in the LinkDef.h but that doesn't change anything.
> 
> However, interactively a simple #include <vector.h> is clearly
> sufficient to be able to instantiate vectors of unsigned and manipulate
> them.
> 
> 2) STL containers of classes
>    +++++++++++++++++++++++++
> As for simple types, instantiating and manipulating a vector of an
> 'added class' works in interactive ROOT.
> 
> However, for me it stops working the moment the STL container of the
> added class is also present in my C++ program.
> 
> Suppose there is, in addition to ClassB, a class Unsigned
> 
> class Unsigned : public TObject {
> private:
>   unsigned value;
> public:
>   Unsigned( unsigned val =0 );
>   operator unsigned() const { return value; }
>   unsigned GetValue() const { return value; }
>   ClassDef(Unsigned,1)
> };
> 
> to avoid the fact that rootcint complains about vector<unsigned>. Now,
> rootcint does not complain about a vector<Unsigned> in ClassB. Strangely
> enoug, rootcint manifestly does not like to see "#pragma link C++ class
> vector<Unsigned>;" (add any +,-,! you like, the result is the same) in
> the LinkDef.h as that triggers the following error:
> 
> Class vector<Unsigned,__malloc_alloc_template<0> >: Streamer() not
> declared
> Class vector<Unsigned,__malloc_alloc_template<0> >: ShowMembers() not
> declared
> Class vector<Unsigned,__malloc_alloc_template<0> >: Class_Name() and
> initialization object not declared
> 
> In any case, if I don't modify the LinkDef.h then rootcint does work.
> However, having a vector<Unsigned> in ClassB makes all the difference
> between the following lines working or not working in interactive ROOT:
> 
>   Unsigned num(20);
>   vector<Unsigned> vecU;
>   vecU.push_back(num);
>   printf("vector of Unsigned first element %i\n",vecU[0].GetValue());
> 
> If Unsigned is in the DLL but no vector<Unsigned> is used in the DLL,
> then interactive ROOT is happy about vector<Unsigned>. If it is used in
> the DLL, then using vector<Unsigned> in interactive ROOT manages to
> crash my session.
> 
> Thanks for any advice on how to do stuff like this,
> Bart
-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland
E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7679480



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:07 MET