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/libPlex-shared/PlexCint.cc: In
member function `virtual void PlexSEIdAltL::Streamer(TBuffer&)':
/home/bviren/srt/minossoft/releases/development/tmp/Linux2-GCC_3_0/Plex/libPlex-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:03 MET