Index: boost/python/object_operators.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/python/object_operators.hpp,v
retrieving revision 1.8
diff -w -u -r1.8 object_operators.hpp
--- boost/python/object_operators.hpp	31 May 2003 14:53:02 -0000	1.8
+++ boost/python/object_operators.hpp	30 Jul 2003 23:47:33 -0000
@@ -10,9 +10,45 @@
 
 # include <boost/python/object_core.hpp>
 # include <boost/python/call.hpp>
+# include <boost/iterator/detail/enable_if.hpp>
+# include <boost/mpl/bool.hpp>
+
+# include <boost/iterator/detail/config_def.hpp>
 
 namespace boost { namespace python { namespace api {
 
+# if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_IS_CONVERTIBLE)
+
+template <class X> char
+is_object_operators_helper(object_operators<X> const&);
+    
+typedef char (&no_type)[2];
+no_type is_object_operators_helper(...);
+
+template <class X> X& make();
+
+template <class L, class R>
+struct is_object_operators
+{
+    enum {
+        value 
+        = (sizeof(api::is_object_operators_helper(api::make<L>()))
+           + sizeof(api::is_object_operators_helper(api::make<R>()))
+           < 4
+        )
+    };
+    typedef mpl::bool_<value> type;
+};
+
+template <class L, class R, class T>
+struct enable_binary
+  : boost::iterators::enable_if<is_object_operators<L,R>, T>
+{};
+#  define BOOST_PYTHON_BINARY_RETURN(T) typename enable_binary<L,R,T>::type
+# else
+#  define BOOST_PYTHON_BINARY_RETURN(T) T
+# endif
+
 template <class U>
 object object_operators<U>::operator()() const
 {
@@ -39,7 +75,7 @@
 
 # define BOOST_PYTHON_COMPARE_OP(op, opid)                      \
 template <class L, class R>                                     \
-bool operator op(L const& l, R const& r)                        \
+BOOST_PYTHON_BINARY_RETURN(bool) operator op(L const& l, R const& r)    \
 {                                                               \
     return PyObject_RichCompareBool(                            \
         object(l).ptr(), object(r).ptr(), opid);                \
@@ -55,7 +91,7 @@
 # define BOOST_PYTHON_BINARY_OPERATOR(op)                               \
 BOOST_PYTHON_DECL object operator op(object const& l, object const& r); \
 template <class L, class R>                                             \
-object operator op(L const& l, R const& r)                              \
+BOOST_PYTHON_BINARY_RETURN(object) operator op(L const& l, R const& r)  \
 {                                                                       \
     return object(l) op object(r);                                      \
 }
@@ -92,5 +128,7 @@
 # undef BOOST_PYTHON_INPLACE_OPERATOR
 
 }}} // namespace boost::python
+
+#include <boost/iterator/detail/config_undef.hpp>
 
 #endif // OBJECT_OPERATORS_DWA2002617_HPP
