It's not a compiler thing. Look at the implementation:
http://www.boost.org/boost/detail/call_traits.hpp
template <typename T> struct call_traits<T&> { typedef T& value_type; // <-- problem here typedef T& reference; typedef const T& const_reference; typedef T& param_type; // hh removed const };
Fwiw, I put a version of call_traits into the Metrowerks::lib a couple of years ago when it was first developed on boost. At that time I gave call_traits<int&>::value_type the type of int. I also built code based on that assumption that looks not too different from what Eric posted:
template<class T, class Allocator = single_deleter<T>,
class Size = number<typename call_traits<Allocator>::value_type::size_type, 1> >
class alloc_ptr;
In this class, the Allocator type may be a reference to an allocator instead of an allocator (and that is a valuable feature I use). Indeed, that is why I used call_traits here in the first place. In retrospect, using remove_reference instead of call_traits here would probably be a better choice...
-Howard
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost