Я незнаком с шаблонами и C ++ в целом, но хочу начать использовать Eigen с gmp.Я следовал учебнику Eigen по пользовательским типам и хочу выводить на терминал.Я получаю ошибку компиляции, которая ссылается на __gmp_expr <__ mpq_struct [1], __mpq_struct [1]>, но я использую mpq_class.Я не могу решить, что происходит.
Я читаю литературу по gmp, которая убедила меня, что использование gmpxx - это нечто большее, чем я могу понять на данный момент.Мне удалось правильно вывести отдельные матричные элементы и скалярные вычисления (определители) правильно.
Мой заголовочный файл mpfr_type.h основан на учебнике Eigen,
#include <gmpxx.h>
#include <boost/operators.hpp>
namespace Eigen {
template<> struct NumTraits<mpq_class> : GenericNumTraits<mpq_class>
{
typedef mpq_class Real;
typedef mpq_class NonInteger;
typedef mpq_class Nested;
static inline Real epsilon() { return 0; }
static inline Real dummy_precision() { return 0; }
static inline Real digits10() { return 0; }
enum {
IsInteger = 0,
IsSigned = 1,
IsComplex = 0,
RequireInitialization = 1,
ReadCost = 6,
AddCost = 150,
MulCost = 100
};
};
}
, и мой код:
#include <Eigen/Dense>
#include <typeinfo>
#include "mpfr_type.h"
using namespace Eigen;
int main()
{
// rational matrix
Matrix<mpq_class,2,2> my_mat;
my_mat(0,0) = mpq_class (2,3);
my_mat(0,1) = mpq_class (7,1);
my_mat(1,0) = mpq_class (5,1);
my_mat(1,1) = mpq_class (11,1);
auto my_det = my_mat.determinant();
std::cout << my_det << std::endl; //works
std::cout << "Here is my matrix:\n" << my_mat << std::endl; // error
Return 0;
}
Я просто ожидаю, что мой код скомпилируется, но получу,
g++ -c -g example1.cpp -o example1.o -I ~/Documents/eigen/
In file included from /home/user/Documents/eigen/Eigen/Core:433:0,
from /home/user/Documents/eigen/Eigen/Dense:1,
from example1.cpp:2:
/home/user/Documents/eigen/Eigen/src/Core/IO.h: In instantiation of ‘static int Eigen::internal::significant_decimals_impl<Scalar>::run() [with Scalar = __gmp_expr<__mpq_struct [1], __mpq_struct [1]>]’:
/home/user/Documents/eigen/Eigen/src/Core/IO.h:155:66: required from ‘std::ostream& Eigen::internal::print_matrix(std::ostream&, const Derived&, const Eigen::IOFormat&) [with Derived = Eigen::Matrix<__gmp_expr<__mpq_struct [1], __mpq_struct [1]>, 2, 2>; std::ostream = std::basic_ostream<char>]’
/home/user/Documents/eigen/Eigen/src/Core/IO.h:220:32: required from ‘std::ostream& Eigen::operator<<(std::ostream&, const Eigen::DenseBase<Derived>&) [with Derived = Eigen::Matrix<__gmp_expr<__mpq_struct [1], __mpq_struct [1]>, 2, 2>; std::ostream = std::basic_ostream<char>]’
example1.cpp:44:42: required from here
/home/user/Documents/eigen/Eigen/src/Core/IO.h:122:40: error: cannot convert ‘Eigen::NumTraits<__gmp_expr<__mpq_struct [1], __mpq_struct [1]> >::Real {aka __gmp_expr<__mpq_struct [1], __mpq_struct [1]>}’ to ‘int’ in return
return NumTraits<Scalar>::digits10();
^
Makefile:12: recipe for target 'example1.o' failed
make: *** [example1.o] Error 1