
The following compiles and uses mpl::and_. Your problem is very similar to a problem I once had. Steven Watanabe was able to fix by just leaving out the ::type references. For instance problem with msvc8: mpl::and_< my_metafunction<...>::type, my_metafunction2<....>::type >::type NO problem with msvc8: mpl::and_< my_metafunction<...>, my_metafunction2<....> > ---------------- #include <boost/mpl/and.hpp> #include "isotropy.hpp" #include "rectangle_data.hpp" #include "point_data.hpp" #include "point_traits.hpp" #include "interval_traits.hpp" #include "rectangle_traits.hpp" #include "point_concept.hpp" #include "interval_concept.hpp" //#include "rectangle_concept.hpp" using namespace boost::mpl; namespace boost { namespace polygon { struct rectangle_concept{}; template <typename T> struct geometry_concept< rectangle_data< T > > { typedef rectangle_concept type; }; template <typename T> struct is_mutable_rectangle_concept { typedef gtl_no type; }; template <> struct is_mutable_rectangle_concept< rectangle_concept > { typedef gtl_yes type; }; template <typename T> struct is_rectangle_concept { typedef gtl_no type; }; template <> struct is_rectangle_concept< rectangle_concept > { typedef gtl_yes type; }; // convolve with point template< typename rectangle_type , typename point_type > rectangle_type& convolve( rectangle_type& rectangle , const point_type& convolution_point , typename enable_if< typename mpl::and_< typename is_mutable_rectangle_concept< typename geometry_concept< rectangle_type >::type > , typename is_point_concept < typename geometry_concept< point_type >::type > > , void >::type *dummy = 0 ); template< typename rectangle_type , typename interval_type > bool encompass( rectangle_type& rectangle , const interval_type& b , orientation_2d orient , typename enable_if< typename mpl::and_< typename is_mutable_rectangle_concept< typename geometry_concept< rectangle_type >::type > , typename is_interval_concept < typename geometry_concept< interval_type
::type > > , bool >::type* ptr = 0 ) { return true; }
// enlarge rectangle to encompass the Rectangle b template < typename rectangle_type_1 , typename rectangle_type_2 > bool encompass( rectangle_type_1& rectangle , const rectangle_type_2& b , typename enable_if< typename mpl::and_< typename is_mutable_rectangle_concept<typename geometry_concept<rectangle_type_1>::type> , typename is_rectangle_concept<typename geometry_concept<rectangle_type_2>::type> > , void >::type* dummy = 0 ) { return true; } // enlarge rectangle to encompass the point b template <typename rectangle_type_1, typename point_type> bool encompass( rectangle_type_1& rectangle , const point_type& b , typename enable_if< typename mpl::and_< typename is_mutable_rectangle_concept< typename geometry_concept<rectangle_type_1 >::type > , typename is_point_concept < typename geometry_concept<point_type
::type > > , void >::type* dummy = 0 ) { return true; }
} } int main() { using namespace boost; using namespace boost::polygon; rectangle_data<int> r; point_data<int> p; encompass(r, p); return 0; } I hope that fixes your problem and you have a great time fixing all of your code. ;-) I was there already. Regards, Christian