
AMDG Steven Watanabe wrote:
AMDG Actually I got the patch for operator_return_type_traits.hpp wrong. I'll post a corrected version later today.
In Christ, Steven Watanabe
Ok. Here it is. In Christ, Steven Watanabe *** operator_return_type_traits.hpp.orig Mon Dec 18 10:42:30 2006 --- operator_return_type_traits.hpp Wed Dec 20 11:57:02 2006 *************** *** 886,891 **** --- 886,896 ---- #endif + namespace boost { + template<class T, std::size_t N> + class array; + } + namespace boost { *************** *** 905,936 **** // deque template<class T, class Allocator, class B> ! struct plain_return_type_2<other_action<subscript_action>, std::deque<T, Allocator>, B> { typedef typename std::deque<T, Allocator>::reference type; }; template<class T, class Allocator, class B> ! struct plain_return_type_2<other_action<subscript_action>, const std::deque<T, Allocator>, B> { typedef typename std::deque<T, Allocator>::const_reference type; }; // vector template<class T, class Allocator, class B> ! struct plain_return_type_2<other_action<subscript_action>, std::vector<T, Allocator>, B> { typedef typename std::vector<T, Allocator>::reference type; }; template<class T, class Allocator, class B> ! struct plain_return_type_2<other_action<subscript_action>, const std::vector<T, Allocator>, B> { typedef typename std::vector<T, Allocator>::const_reference type; }; // basic_string template<class Char, class Traits, class Allocator, class B> ! struct plain_return_type_2<other_action<subscript_action>, std::basic_string<Char, Traits, Allocator>, B> { typedef typename std::basic_string<Char, Traits, Allocator>::reference type; }; template<class Char, class Traits, class Allocator, class B> ! struct plain_return_type_2<other_action<subscript_action>, const std::basic_string<Char, Traits, Allocator>, B> { typedef typename std::basic_string<Char, Traits, Allocator>::const_reference type; }; --- 910,991 ---- // deque template<class T, class Allocator, class B> ! struct return_type_2<other_action<subscript_action>, std::deque<T, Allocator>, B> { typedef typename std::deque<T, Allocator>::reference type; }; template<class T, class Allocator, class B> ! struct return_type_2<other_action<subscript_action>, const std::deque<T, Allocator>, B> { typedef typename std::deque<T, Allocator>::const_reference type; }; // vector template<class T, class Allocator, class B> ! struct return_type_2<other_action<subscript_action>, std::vector<T, Allocator>, B> { typedef typename std::vector<T, Allocator>::reference type; }; template<class T, class Allocator, class B> ! struct return_type_2<other_action<subscript_action>, const std::vector<T, Allocator>, B> { typedef typename std::vector<T, Allocator>::const_reference type; }; // basic_string template<class Char, class Traits, class Allocator, class B> ! struct return_type_2<other_action<subscript_action>, std::basic_string<Char, Traits, Allocator>, B> { typedef typename std::basic_string<Char, Traits, Allocator>::reference type; }; template<class Char, class Traits, class Allocator, class B> ! struct return_type_2<other_action<subscript_action>, const std::basic_string<Char, Traits, Allocator>, B> { typedef typename std::basic_string<Char, Traits, Allocator>::const_reference type; + }; + + template<class T, int N, class B> + struct return_type_2<other_action<subscript_action>, boost::array<T, N>, B> { + typedef typename boost::array<T, N>::reference type; + }; + template<class T, int N, class B> + struct return_type_2<other_action<subscript_action>, const boost::array<T, N>, B> { + typedef typename boost::array<T, N>::const_reference type; + }; + + + // -- plus_action for basic_string ----------------------------------------------------------------- + template<class Char, class Traits, class Allocator> + struct plain_return_type_2<arithmetic_action<plus_action>, std::basic_string<Char, Traits, Allocator>, std::basic_string<Char, Traits, Allocator> > { + typedef std::basic_string<Char, Traits, Allocator> type; + }; + // -- pointer versions ----------------------------------------------------------------------------- + template<class Char, class Traits, class Allocator> + struct plain_return_type_2<arithmetic_action<plus_action>, std::basic_string<Char, Traits, Allocator>, Char*> { + typedef std::basic_string<Char, Traits, Allocator> type; + }; + template<class Char, class Traits, class Allocator> + struct plain_return_type_2<arithmetic_action<plus_action>, std::basic_string<Char, Traits, Allocator>, const Char*> { + typedef std::basic_string<Char, Traits, Allocator> type; + }; + template<class Char, class Traits, class Allocator> + struct plain_return_type_2<Char*, arithmetic_action<plus_action>, std::basic_string<Char, Traits, Allocator> > { + typedef std::basic_string<Char, Traits, Allocator> type; + }; + template<class Char, class Traits, class Allocator> + struct plain_return_type_2<const Char*, arithmetic_action<plus_action>, std::basic_string<Char, Traits, Allocator> > { + typedef std::basic_string<Char, Traits, Allocator> type; + }; + // -- array versions --------------------------------------------------------------------------------- + template<class Char, class Traits, class Allocator, int N> + struct plain_return_type_2<arithmetic_action<plus_action>, std::basic_string<Char, Traits, Allocator>, Char[N]> { + typedef std::basic_string<Char, Traits, Allocator> type; + }; + template<class Char, class Traits, class Allocator, int N> + struct plain_return_type_2<arithmetic_action<plus_action>, std::basic_string<Char, Traits, Allocator>, const Char[N]> { + typedef std::basic_string<Char, Traits, Allocator> type; + }; + template<class Char, class Traits, class Allocator, int N> + struct plain_return_type_2<Char[N], arithmetic_action<plus_action>, std::basic_string<Char, Traits, Allocator> > { + typedef std::basic_string<Char, Traits, Allocator> type; + }; + template<class Char, class Traits, class Allocator, int N> + struct plain_return_type_2<const Char[N], arithmetic_action<plus_action>, std::basic_string<Char, Traits, Allocator> > { + typedef std::basic_string<Char, Traits, Allocator> type; };