Opened 4 years ago
Closed 4 years ago
#13577 closed Bugs (fixed)
rational_adaptor does not compile with fixed width cpp_int
Reported by: | 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
Note:
See TracTickets
for help on using tickets.
It's a bug. Fixed in https://github.com/boostorg/multiprecision/commit/61f4fd8778074cbd78bceee739b5076846b75b23