Opened 4 years ago

Closed 4 years ago

#13577 closed Bugs (fixed)

rational_adaptor does not compile with fixed width cpp_int

Reported by: jgarber1@… Owned by: John Maddock
Milestone: To Be Determined Component: multiprecision
Version: Boost 1.67.0 Severity: Problem
Keywords: Cc:

Description

Hello, I am trying to use the rational_adaptor class with a 128-bit cpp_int as a fixed-width alternative to cpp_rational. However, attempting to do so results in a compiler error.

#include <boost/multiprecision/cpp_int.hpp>

using namespace boost::multiprecision;

using Rational = number<rational_adaptor<cpp_int_backend<128, 128, signed_magnitude, checked, void>>>;

int main() {
    Rational x = 3;
    x /= 2;
}

Compiling this program (Clang, Mac 10.12, Boost 1.67) results in the following error

/usr/local/include/boost/multiprecision/rational_adaptor.hpp:268:11: error: no matching function for call to
      'eval_is_zero'
   return eval_is_zero(val.data().numerator().backend());
          ^~~~~~~~~~~~
/usr/local/include/boost/multiprecision/rational_adaptor.hpp:230:7: note: in instantiation of function template
      specialization
      'boost::multiprecision::backends::eval_is_zero<boost::multiprecision::backends::cpp_int_backend<128, 128,
      boost::multiprecision::cpp_integer_type::signed_magnitude, boost::multiprecision::cpp_int_check_type::checked,
      void> >' requested here
   if(eval_is_zero(o))
      ^
/usr/local/include/boost/multiprecision/detail/default_ops.hpp:154:4: note: in instantiation of function template
      specialization 'boost::multiprecision::backends::eval_divide<boost::multiprecision::backends::cpp_int_backend<128,
      128, boost::multiprecision::cpp_integer_type::signed_magnitude,
      boost::multiprecision::cpp_int_check_type::checked, void> >' requested here
   eval_divide(result, t);
   ^
/usr/local/include/boost/multiprecision/number.hpp:447:7: note: in instantiation of function template specialization
      'boost::multiprecision::default_ops::eval_divide<boost::multiprecision::backends::rational_adaptor<boost::multiprecision::backends::cpp_int_backend<128,
      128, boost::multiprecision::cpp_integer_type::signed_magnitude,
      boost::multiprecision::cpp_int_check_type::checked, void> >, int>' requested here
      eval_divide(m_backend, canonical_value(v));
      ^
bug2.cpp:9:7: note: in instantiation of function template specialization
      'boost::multiprecision::number<boost::multiprecision::backends::rational_adaptor<boost::multiprecision::backends::cpp_int_backend<128,
      128, boost::multiprecision::cpp_integer_type::signed_magnitude,
      boost::multiprecision::cpp_int_check_type::checked, void> >,
      boost::multiprecision::expression_template_option::et_off>::operator/=<int>' requested here
    x /= 2;
      ^
/usr/local/include/boost/multiprecision/rational_adaptor.hpp:266:13: note: candidate template ignored: could not match
      'rational_adaptor' against 'cpp_int_backend'
inline bool eval_is_zero(const rational_adaptor<IntBackend>& val)
            ^
/usr/local/include/boost/multiprecision/cpp_int/misc.hpp:155:4: note: candidate template ignored: substitution failure
      [with MinBits1 = 128, MaxBits1 = 128, SignType1 = boost::multiprecision::cpp_integer_type::signed_magnitude,
      Checked1 = boost::multiprecision::cpp_int_check_type::checked, Allocator1 = void]: no type named 'type' in
      'boost::enable_if_c<false, bool>'
   eval_is_zero(const cpp_int_backend<MinBits1, MaxBits1, SignType1, Checked1, Allocator1>& val) BOOST_NOEXCEPT
   ^
1 error generated.

Is the rational_adaptor class intended for use with fixed-width integers, or just arbitrary precision ones?

Thank you

Change History (1)

comment:1 by John Maddock, 4 years ago

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.