0

I'm using Boost.QVM and boost::multiprecision::cpp_dec_float_50 as my scalar for my quaternion.

I tried my program with double instead of boost::multiprecision::cpp_dec_float_50 and it worked, so I believe it is the cause of the problem.

#include <bits/stdc++.h>
#include <boost/numeric/odeint.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/qvm.hpp>

using namespace std;


namespace boost { namespace qvm {
template <> struct is_scalar<boost::multiprecision::cpp_dec_float_50>  { static bool const value=true; };
}
}

typedef boost::multiprecision::cpp_dec_float_50 value_type;

typedef boost::qvm::mat<value_type, 3, 3> matrix;

typedef boost::qvm::vec<value_type,3> triple;

typedef boost::qvm::quat<value_type> quaternion;

int main()
{
    quaternion q = {1,1,1,1};
    boost::qvm::normalize(q);
}

The error I got is:

/usr/bin/ld: /tmp/ccGMS28g.o: in function `boost::qvm::enable_if_c<boost::qvm::is_quat<boost::qvm::quat<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1> > >::value, void>::type boost::qvm::normalize<boost::qvm::quat<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1> > >(boost::qvm::quat<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1> >&)':
test2.cpp:(.text._ZN5boost3qvm9normalizeINS0_4quatINS_14multiprecision6numberINS3_8backends13cpp_dec_floatILj50EivEELNS3_26expression_template_optionE1EEEEEEENS0_11enable_if_cIXsrNS0_7is_quatIT_EE5valueEvE4typeERSD_[_ZN5boost3qvm9normalizeINS0_4quatINS_14multiprecision6numberINS3_8backends13cpp_dec_floatILj50EivEELNS3_26expression_template_optionE1EEEEEEENS0_11enable_if_cIXsrNS0_7is_quatIT_EE5valueEvE4typeERSD_]+0x25e): undefined reference to `boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1> boost::qvm::sqrt<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1> >(boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1>)'
collect2: error: ld returned 1 exit status
Adrian Mole
  • 49,934
  • 160
  • 51
  • 83
orfvl
  • 111
  • 5
  • Seems similar to https://github.com/boostorg/qvm/issues/24, where `boost::qvm::sqrt` wasn't defined. In your case it's `boost:qvm::sqrt` – Kevin Dec 16 '21 at 20:37
  • Thx. The problem is the same , but unfortunately the given solution was a fix in the library. I don't know how it could solve my problem. – orfvl Dec 17 '21 at 13:16
  • You could provide the specialization yourself. I'll be able to write an answer later if you can't come up with it – Kevin Dec 17 '21 at 13:35
  • I'm actually unable to reproduce the error using boost 1.78.0 - https://godbolt.org/z/9Yd4jWo1q. But I get the error using version 1.77.0. Try update your version of boost. – Kevin Dec 17 '21 at 21:33
  • Ok me as well. Thanks. – orfvl Dec 17 '21 at 21:53

0 Answers0