
Folks I'm having some difficulties understanding the subtleties of enable_if, consider: using namespace boost; template <unsigned B> struct dummy {}; template <unsigned B, class Integer> typename boost::enable_if<mpl::and_<is_signed<Integer>, mpl::bool_<(sizeof(Integer) <= sizeof(long))> > >::type bar(dummy<B>&, const Integer&) { } template <unsigned B, class Integer> typename boost::enable_if<mpl::and_<is_unsigned<Integer>, mpl::bool_<(sizeof(Integer) <= sizeof(long))> > >::type bar(dummy<B>&, const Integer&) { } Then calling: dummy<2> d; bar(d, 2); Leads to an ambiguity between the two overloads (both gcc and VC++10), how can that be? However, changing the condition to: template <unsigned B, class Integer> typename boost::enable_if<mpl::and_<is_signed<Integer>, mpl::bool_<(B || !B) && (sizeof(Integer) <= sizeof(long))> > >::type bar(dummy<B>&, const Integer&) { } template <unsigned B, class Integer> typename boost::enable_if<mpl::and_<is_unsigned<Integer>, mpl::bool_<(B || !B) && (sizeof(Integer) <= sizeof(long))> > >::type bar(dummy<B>&, const Integer&) { } "fixes" things. But this fix isn't always possible. Thoughts? Thanks, John.