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