Dear ROOTers,
take a look at this simple code (file a.c):
#include "TObject.h"
#include "TNamed.h"
class A: virtual public TObject { public: ~A(void); A(void){} };
class B: public A, virtual public TNamed { public: ~B(void); B(void){} };
A::~A(void) {}
B::~B(void) {}
class TObject must be declared as virtual base class to remove double
copy of TObject in A and B.
When I try to compile this code (root-2.21-08 and root-2.23-04) I get the
same error messages:
$ g++ -I $ROOTSYS/include -c a.c
a.c: In method `B::~B()':
a.c:8: request for member `operator delete' is ambiguous
/usr/local/root/include/TObject.h:162: candidates are: static void
TObject::operator delete(void *, void *)
/usr/local/root/include/TObject.h:159: candidates are: static void
TObject::operator delete(void *)
/usr/local/root/include/TObject.h:162: static void
TObject::operator delete(void *, void *)
/usr/local/root/include/TObject.h:159: static void
TObject::operator delete(void *)
These are lines 159 and 162 of file TObject.h:
void operator delete(void *ptr);
void operator delete(void *ptr, void *vp);
These are lines with delete operator declarations from file "new"
corresponding to gcc-2.95.1:
void operator delete (void *) throw();
void operator delete[] (void *) throw();
void operator delete (void *, const std::nothrow_t&) throw();
void operator delete[] (void *, const std::nothrow_t&) throw();
The declaration
void operator delete(void *ptr, void *vp);
is not present in "new" file.
File TObject.cxx contains the code:
#ifdef R__PLACEMENTDELETE
//______________________________________________________________________________
void TObject::operator delete(void *ptr, void *vp)
{
// Only called by placement new when throwing an exception.
if (ptr && vp) { }
}
#endif
So this is empty operator. Does ROOT need it really?
With best wishes,
Alexander Zvyagin.
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:41 MET