Hi,
There is actually a C++ issue in your class:
class MyClass: public TObject
{
public:
MyClass();
~MyClass();
std::ifstream fi; //! excluded
ClassDef(MyClass,1) //MyClass
};
You class 'contains' an ifstream object and does not provide an
explicit copy constructor. In consequence the C++ compiler
provide a default constructor and CINT assume its existence and
refer to it.
You can get a different version of the error message by just
doing:
MyClass m;
MyClass m2(m);
The problem here is that any std stream (derived from std::ios_base)
is explicitly NOT copyable. This is implemented by making the
copy constructor of std::ios_base private and non-implemented.
For your MyClass, you __have to__ provide a copy constructor
that resolved the issue of what it means for the ifstream.
Or you can make your object non-copiable by adding:
private:
MyClass(const MyClass&);
Cheers,
Philippe.
-----Original Message-----
From: owner-roottalk@pcroot.cern.ch
[mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Hajime Nanjyo
Sent: Monday, January 26, 2004 9:07 PM
To: roottalk@pcroot.cern.ch
Subject: [ROOT] ROOT class with ifstream
Dear Rooters,
I forget the subject of the last mail
for the ROOT class which have a member of ifstream.
Best Regards,
Hajime
> Dear Rooters,
>
> I am suffering troubles when constructing my class
> with ifstream for ROOT I/O.
>
> The shared library, libMyClass.so is successfully construced, but
> it can't be linked to other objects and can't be loaded in ROOT(CINT).
>
> If the line, 'std::ifstream fi; //! excluded'
> is commented out (at MyClass.h), all works fine.
>
>
> Is there any idea to solve the problem?
>
> /////////////////////////////////////////////////
> The error outputs are...
>
> root [1] gSystem->Load("libMyClass")
> dlopen error: /afs/cern.ch/user/n/nanjo/MyClassStreamer/./libMyClass.so:
undefined symbol: _ZNSt8ios_baseC2ERKS_
> Load Error: Failed to load Dynamic link library
/afs/cern.ch/user/n/nanjo/MyClassStreamer/./libMyClass.so
> *** Interpreter error recovered ***
>
> or
>
> g++ `root-config --cflags` -c MyClass.C
> rootcint -f MyClassDict.C -c MyClass.h MyClassLinkDef.h
> g++ `root-config --cflags` -c MyClassDict.C
> g++ -shared MyClass.o MyClassDict.o -o libMyClass.so
> // Succeed
> g++ `root-config --cflags` -c write.C
> // OK
> g++ write.o libMyClass.so `root-config --libs` -o write
> // Fail
> libMyClass.so: undefined reference to
`std::ios_base::ios_base[not-in-charge](std::ios_base const&)'
> collect2: ld returned 1 exit status
>
>
> /////////////////////////////////////////////////
> My environment is...
>
> uname -a
> Red Hat Linux release 7.3 (Valhalla)
> Linux lxplus072 2.4.20-28.7.cernsmp #1 SMP Fri Jan 9 12:37:16 CET 2004
i686 unknown.
>
> g++ -v
> Reading specs from
/usr/local/gcc-alt-3.2/lib/gcc-lib/i686-pc-linux-gnu/3.2/specs
> Configured with:
./configure --prefix=/usr/local/gcc-alt-3.2 --enable-shared
> Thread model: posix
> gcc version 3.2
>
> The ROOT is on afs at CERN.
> *******************************************
> * *
> * W E L C O M E to R O O T *
> * *
> * Version 3.10/02 16 December 2003 *
> * *
> * You are welcome to visit our Web site *
> * http://root.cern.ch *
> * *
> *******************************************
> ///////////////////////////////////////////////////
>
>
>
>
> My codes are as follows.
>
> ///////////////////////////////////////////////////
> //
> // MyClass.h
> //
> #ifndef MyClass_HH
> #define MyClass_HH
> #include <fstream>
>
> #include "TObject.h"
>
> class MyClass: public TObject
> {
> public:
> MyClass();
> ~MyClass();
> void Set(int s);
>
> public:
> int size;
> std::ifstream fi; //! excluded
> ClassDef(MyClass,1) //MyClass
> };
>
> #endif
> ///////////////////////////////////////////////////
> ///////////////////////////////////////////////////
> ///////////////////////////////////////////////////
> //
> // MyClass.C
> //
> #include "MyClass.h"
> #if !defined(__CINT__)
> ClassImp(MyClass);
> #endif
> MyClass::MyClass() {
> size=0;
> }
>
> MyClass::~MyClass() {
> ;
> }
>
>
> void MyClass::Set(int s) {
> size=s;
> }
>
> ///////////////////////////////////////////////////
> //
> // hadDataLinkDef.h
> //
> #ifdef __CINT__
> #pragma link off all globals;
> #pragma link off all classes;
> #pragma link off all functions;
> #pragma link C++ class MyClass;
> #endif
> ///////////////////////////////////////////////////
> ///////////////////////////////////////////////////
> ///////////////////////////////////////////////////
> //
> // write.C
> //
> #include "TApplication.h"
> #include "TFile.h"
> #include "TTree.h"
> #include "MyClass.h"
>
> int main(int argc,char** argv)
> {
> TApplication app("app", &argc, argv);
> TFile *tf = new TFile("tmp.root","RECREATE");
> TTree *tree = new TTree("tree","tmp");
>
> MyClass *data = new MyClass();
> tree->Branch("data","MyClass",&data);
>
> for (int i=0;i<5;++i) {
> data->Set(i+1);
> tree->Fill();
> }
>
> tf->Write();
> delete data;
>
> return 0;
> }
> ///////////////////////////////////////////////////
> ///////////////////////////////////////////////////
> ///////////////////////////////////////////////////
> //
> // compile script
> //
> rm *.o
> rm *.so
> rm MyClassDict.C
> g++ `root-config --cflags` -c MyClass.C
> rootcint -f MyClassDict.C -c MyClass.h MyClassLinkDef.h
> g++ `root-config --cflags` -c MyClassDict.C
> g++ -shared MyClass.o MyClassDict.o -o libMyClass.so
> g++ `root-config --cflags` -c write.C
> g++ write.o libMyClass.so `root-config --libs` -o write
> ///////////////////////////////////////////////////
This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:05 MET