Hi Ole,
On Fri, 23 Aug 2002 18:38:10 +0200
Ole Streicher <ole@ifh.de> wrote
concerning "Re: [ROOT] Rootcint again: Linker errors":
> Hi Rene!
>
> Rene Brun writes:
> > You must be consistent if you use namespaces.
>
> Thank you. Now it compiles, but it still doesn't run. It get the message
>
> Warning in <TClass::TClass>: no dictionary for class myexperiment::EventHeader is available
> Error in <TTree::Bronch>: Cannot find dictionary for class: myexperiment::EventHeader
You need to tell CINT to enable use of `nested' classes:
#pragma link off all functions;
#pragma link off all globals;
#pragma link off all classes;
#pragma link C++ nestedclass;
#pragma link C++ nestedtypedef;
#pragma link C++ namespace YOUR_NS_NAME;
#pragma link C++ class YOUR_NS_NAME::YOUR_CLASS_NAME;
#pragma link off function YOUR_NS_NAME::YOUR_FUNC_NAME;
#pragma link C++ function YOUR_NS_NAME::YOUR_FUNC_NAME;
See also [1,2] (the manual actully explaines this :-)
Here's an example:
//__________________________________________________________________
//
// File Foo.hh
//
#ifndef Foo_hh
#define Foo_hh
#ifndef ROOT_TObject
#include "TObject.h"
#endif
namespace Bar
{
class Foo : public TObject
{
private:
int _foo;
public:
Foo(int foo);
void Print(Option_t* option) const;
ClassDef(Foo,1)
};
}
#endif
//
// EOF
//
//__________________________________________________________________
//
// File Foo.cc
//
#ifndef Foo_hh
#include "Foo.hh"
#endif
#ifndef __IOSTREAM__
#include <iostream>
#endif
ClassImp(Bar::Foo);
Bar::Foo::Foo(int foo) : _foo(foo) {}
void Bar::Foo::Print(Option_t* option) const
{
cout << "Foo is " << _foo << endl;
}
//
// EOF
//
//__________________________________________________________________
//
// File FooLinkDef.hh
//
// -*- mode: c++ -*-
//____________________________________________________________________
//
#ifndef __CINT__
#error Not for compilation
#endif
#pragma link off all functions;
#pragma link off all globals;
#pragma link off all classes;
#pragma link C++ nestedclass;
#pragma link C++ namespace Bar;
#pragma link C++ class Bar::Foo+;
//
// EOF
//
compile and try with (assuming you're using GCC and GNU ld):
rootcint -f FooDict.cc -c Foo.hh FooLinkDef.hh
g++ -shared -o Foo.so -Wl,-soname,Foo.so Foo.cc FooDict.cc
and try it in a ROOT session:
root [0] gSystem->Load("Foo.so");
root [1] Bar::Foo* foo = new Bar::Foo(10);
root [2] foo->Print()
Foo is 10
root [3] TTree* tree = new TTree("t", "T")
root [4] tree->Branch("foo", "Bar::Foo", &foo)
(class TBranch*)0x87dd328
The same rules applies for nested classes BTW. Search roottalk, and
you'll find a number of posts concerning this (some of them from me
:-)
Hope that helps.
a question for Masa, and the ROOT team: Why isn't this enabled per
default? Is there a performance penalty to pay? Will ROOT at some
point put all their classes into a `Root' (or `ROOT') namespace,
instead of the `T' prefix? I think that would be a good idea (for
ROOT 4 or something) - most compilers should be able to handle
namespaces by now, as it's such an intergral part of the ISO/IEC C++
standard. Perhaps one could so something like
#ifndef COMPATIBILITY
#define NS(x) Root:: x
#define NSDECL(x) x
#define NSCTOR(x) x
namespace Root {
#else
#define NS(x) T ## x
#define NSDECL(x) T ## x
#define NSCTOR(x) T ## x
#endif
class NSDECL(Object) {
private:
public:
NSCTOR(Object)();
~NSCTOR(Object)();
};
NS(Object)::NSCTOR(Object) ()
{}
NS(Object)::~NSCTOR(Object) ()
{}
#ifndef COMPATIBILITY
}
#endif
or what ever works. Ofcourse you'd have to different binary version
of ROOT: One using namespaces and one not. Another option would be to
leave the `T' in, and just do
#ifdef USE_NAMESPACES
namespace Root {
#endif
class TObject
...
#ifdef USE_NAMESPACES
}
#endif
Or one could forget about compatibility between ROOT 3 and 4 (or have
some layer or something).
Yours,
____ | Christian Holm Christensen
|_| | -------------------------------------------------------------
| | Address: Sankt Hansgade 23, 1. th. Phone: (+45) 35 35 96 91
_| DK-2200 Copenhagen N Cell: (+45) 24 61 85 91
_| Denmark Office: (+45) 353 25 305
____| Email: cholm@nbi.dk Web: www.nbi.dk/~cholm
| |
[1] http://root.cern.ch/root/Cint.phtml?faq
[2] http://root.cern.ch/root/Cint.phtml?ref
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:05 MET