Dear Philippe,
Thanks a lot.
Your suggestion is really helpful and my class works fine
adding explicit copy constructor or private copy constructor
as you mentioned.
I usnderstand as follows.
The class ifstream is defined as
'class ifstream : public fstreambase, public istream'
and istream is defined as
'class istream : virtual public ios'.
Then the class ios has private copy constructor as
class ios : public _ios_fields {
ios& operator=(ios&); /* Not allowed! */
ios (const ios&); /* Not allowed! */
public:
.
.
.
};
.
So ifstream does not provide a copy constructor.
Best Regards,
Hajime
> 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