Hello Philippe and Ole, Cint has a flag of ignoring std namespace. std namespace is ignored (means std::xxx are in global namespace) by default. Cint handles std:: only when -Y0 flag is given to both makecint/rootcint and cint/root. >From the symptom, rootcint does not get -Y0 but root is started with -Y0. In your ROOT run-time, there are following classes. class std::string namespace my class my::MyClass And it tries to define a member function 'my::MyClass::f(string)'. Note that string is loaded as std::string, so string can not be found. Cint generates a new class entry in namespace my. So, class my::string is added as undefined class entity. Solution to this situation is to give -Y0 flag for rootcint too. Thank you Masaharu Goto ----- Original Message ----- From: "Philippe Canal" <pcanal@fnal.gov> To: <roottalk@pcroot.cern.ch>; "Cint" <cint@pcroot.cern.ch> Sent: Friday, September 13, 2002 4:46 AM Subject: [CINT] RE: [ROOT] "std::string" in Root? > Hi Ole, > > I am not exactly sure of the circumstances of your failure. In the example below, I was successful in making it work (at least with the version at the head of the CVS repository). > > However, there IS a known limitation that you might be encountering. Since you are using a compiled function (or method here) which expects a std::string, you need to make sure that the std::string used at the ROOT prompt is __compiled__. On most platform in the default mode, there is no dictionary for std::string provided. This means that you have to provide one by yourself, either by compiling the candles or either generating it (as I did in the example below). > > If you do have a dictionary for std::string and you still have a problem, please send us a more detailed bug report (including actual commands tried and their faulty result and/or error messages as well as the linkdef you used). > > Cheers, > Philippe. > > PS. I tried: > rootcint -f dict.cc -c MyClass.h MyClassLinkDef.h && g++ --shared -o libst.so dict.cc `root-config --cflags` && root.exe > ******************************************* > * * > * W E L C O M E to R O O T * > * * > * Version 3.03/08 12 September 2002 * > * * > * You are welcome to visit our Web site * > * http://root.cern.ch * > * * > ******************************************* > > Compiled for linux with thread support. > > CINT/ROOT C/C++ Interpreter version 5.15.56, Sep 4 2002 > Type ? for help. Commands must be C++ statements. > Enclose multiple statements between { }. > root [0] .L libst.so > root [1] string s("this is an std string") > root [2] my::MyClass m > root [3] m.GetMe(s) > this is an std string > (int)0 > > With the files: > <MyClassLinkDef.h> > #ifdef __CINT__ > #pragma link off all classes; > #pragma link off all functions; > #pragma link off all globals; > > #pragma link C++ namespace my; > #pragma link C++ class my::MyClass; > #pragma link C++ class std::string; > > #endif > <\MyClassLinkDef.h> > > <MyClass.h> > #include <string> > #include <Rtypes.h> > namespace my { > class MyClass { > public: > int GetMe(std::string s) { fprintf(stderr,"%s\n",s.c_str()); return 0;}; > ClassDef(MyClass, 1) > }; > } > > // rootcint -f dict.cc -c MyClass.h MyClassLinkDef.h > // g++ --shared -o libst.so dict.cc `root-config --cflags` > <\MyClass.h> > > ---------- Forwarded message ---------- > Date: Wed, 11 Sep 2002 09:36:39 +0200 > From: Ole Streicher <ole@ifh.de> > To: roottalk <roottalk@pcroot.cern.ch> > Subject: [ROOT] "std::string" in Root? > > Hello! > > I already asked this, but the mail seems to be lost in space... > > When I compile the class definition > > #include <string> > #include <RTypes.h> > namespace my { > class MyClass { > public: > int GetMe(std::string); > ClassDef(MyClass, 1) > }; > } > > I cannot use it from within root. It always tries to use "my::string" > as the parameter definition of GetMe, and thus I cannot call GetMe > with a string argument. > > So, my question is how it is possible to use strings within root? > > Ole > >
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:09 MET