
Hi Steven, On Nov 19, 2007 7:37 PM, Steven Watanabe <steven@providere-consulting.com> wrote:
AMDG
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: test_alloc.cc:88: 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 outdated. Is there a BOOST defect macro for this behavior, to enable workarounds when the compiler cannot handle it? Thanks, Corrado -- __________________________________________________________________________ dott. Corrado Zoccolo mailto:zoccolo@di.unipi.it 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