Hi, This seems on incompatibility between CINT and gcc 3.0. It is likely (I did not test it but other reports point to this) that it would work with gcc 3.1 Cheers, Philippe -----Original Message----- From: owner-roottalk@pcroot.cern.ch [mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Brett Viren Sent: Friday, August 09, 2002 1:24 PM To: roottalk Subject: [ROOT] Dictionary not compilable with GCC 3.0 Hi, Bug report for you. We have a class (PlexSEIdAltL) which subclasses an STL vector (std::vector<PlexSEIdAltLItem>) and has a LinkDef.h entry like: #pragma link C++ class PlexSEIdAltL+; The generated Streamer code failes to compile under GCC 3.0.4. The generated code is: void PlexSEIdAltL::Streamer(TBuffer &R__b) { // Stream an object of class PlexSEIdAltL. if (R__b.IsReading()) { PlexSEIdAltL::Class()->ReadBuffer(R__b, this); { clear(); int R__i, R__n; R__b >> R__n; for (R__i = 0; R__i < R__n; R__i++) { PlexSEIdAltLItem R__t; R__t.Streamer(R__b); push_back(R__t); } } } else { PlexSEIdAltL::Class()->WriteBuffer(R__b, this); { R__b << int(size()); vector<PlexSEIdAltLItem,__malloc_alloc_template<0> >::iterator R__k; for (R__k = begin(); R__k != end(); ++R__k) { // <---- ERROR (*R__k).Streamer(R__b); } } } } Where I have marked the line generating the error. If the declaration of the iterator is changed from: vector<PlexSEIdAltLItem,__malloc_alloc_template<0> >::iterator R__k; to vector<PlexSEIdAltLItem>::iterator R__k; then compilation succeeds. The error message is: /home/bviren/srt/minossoft/releases/development/tmp/Linux2-GCC_3_0/Plex/libP lex-shared/PlexCint.cc: In member function `virtual void PlexSEIdAltL::Streamer(TBuffer&)': /home/bviren/srt/minossoft/releases/development/tmp/Linux2-GCC_3_0/Plex/libP lex-shared/PlexCint.cc:2209: no match for `std::__normal_iterator<PlexSEIdAltLItem*, std::vector<PlexSEIdAltLItem, std::__malloc_alloc_template<0> > >& = std::__normal_iterator<PlexSEIdAltLItem*, std::vector<PlexSEIdAltLItem, std::allocator<PlexSEIdAltLItem> > >' operator /usr/include/g++-v3/bits/stl_iterator.h:453: candidates are: std::__normal_iterator<PlexSEIdAltLItem*, std::vector<PlexSEIdAltLItem, std::__malloc_alloc_template<0> > >& std::__normal_iterator<PlexSEIdAltLItem*, std::vector<PlexSEIdAltLItem, std::__malloc_alloc_template<0> > >::operator=(const std::__normal_iterator<PlexSEIdAltLItem*, std::vector<PlexSEIdAltLItem, std::__malloc_alloc_template<0> > >&) (and a similar error for the "!=" operation) Which, if you stare at it long enough, seems that std::vector::begin() returns an iterator with a different allocator than the explicitly stated one. ROOT is from CVS as of yesterday or so, GCC 3.0.4 on Debian x86. -Brett.
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:04 MET