Boost logo

Boost :

From: Corrado Zoccolo (czoccolo_at_[hidden])
Date: 2007-11-20 15:00:15

Hi Steven,

On Nov 19, 2007 7:37 PM, Steven Watanabe <steven_at_[hidden]>

> Both "new T" and has_new<T> look in base
> classes of T. SFINAE seems to work on both msvc 8.0 and gcc 3.4.4
> I think that what I would do is create a generic allocator
> that looks up the correct operator new/delete
> <snipped allocator code>

I tested with this code:

typedef void * (*new_signature_t)(size_t);

template<typename T, T U>
struct has_ {
  typedef T type;

template<typename T>
typename has_<new_signature_t, &T::operator new>::type get_new(T*) { return
T::operator new; }

new_signature_t get_new(...) { return ::operator new; }

and it actually works with recent compilers like g++ 4.1.2, but it fails on
g++ 3.3.5, on a simple usage like:
struct A {};
int main() {
  A* a_= ::new( get_new((A*)0)(sizeof(A)) ) A();
  return 0;

with the following error: error: `operator new' is not a member of type `A'

It seems that on this compiler, the substitution failure of a pointer to
(static) member function is actually treated as error.

Do you know some technique/workaround to make this work also on g++ 3.3? It
is the compiler I'm using at work, so I'd like to support it even if it is
Is there a BOOST defect macro for this behavior, to enable workarounds when
the compiler cannot handle it?


dott. Corrado Zoccolo                          mailto:zoccolo_at_[hidden]
PhD - Department of Computer Science - University of Pisa, Italy
The self-confidence of a warrior is not the self-confidence of the average
man. The average man seeks certainty in the eyes of the onlooker and calls
that self-confidence. The warrior seeks impeccability in his own eyes and
calls that humbleness.
                              Tales of Power - C. Castaneda

Boost list run by bdawes at, gregod at, cpdaniel at, john at