Re: [eigen] new types / NumTraits

[ Thread Index | Date Index | More Archives ]


Eigen needs to know how many significant digits a type has, which by default it does using:


In your case the easiest solution is to specialize:

namespace Eigen { namespace internal {
  struct significant_decimals_impl<TpFloat>
      : public significant_decimals_impl<TpFloatBase>
  { };
} }

We should probably add this to the documentation (and perhaps consider not putting it into the internal namespace).

However, there are likely other functions which fail if you can't convert your type to int.

If you want to implement a cast from your type to int, but can't add an operator to your class, you can specialize this struct (in Eigen::internal):

  template<typename OldType, typename NewType>  struct cast_impl;

See the last line of your error to locate the default implementation.


On 2016-07-22 16:38, Peter wrote:
Dear All,

first I would like to thank everyone involved in the Eigen library.
I'm using Eigen more  and more for projects I traditionally used octave.
It's really fun using Eigen.

In return I've started to look closer into possible applications. One
of mine consists in using Eigen for user defined types. In the attached
I'm trying to to use Eigen for the following struct:

struct  TpFloat
     TpFloat() {};

     explicit TpFloat( const int r) : v(r), Counter(0) {};
     TpFloat( const TpFloatBase r) : v(r), Counter(0) {};
     TpFloat( const TpFloatBase r, const int n ) : v(r), Counter(n) {};

     TpFloatBase v;
     int         Counter;

     TpFloat operator-() { return TpFloat( -v, Counter+1) ; }


The initialization of a matrix works fine, however I have compilation
problems for

std::cout << A << std::endl;

getting errors like

$  g++ -std=c++11  -march=native -DNDEBUG -I $HOME/Eigen/eigen E.C -o E
-lm && ./E

In file included from /home/peter/Eigen/eigen/Eigen/Core:259:0,
                  from /home/peter/Eigen/eigen/Eigen/Dense:1,
                  from E.C:5:
/home/peter/Eigen/eigen/Eigen/src/Core/MathFunctions.h: In instantiation
of ‘static NewType Eigen::internal::cast_impl<OldType,
NewType>::run(const OldType&) [with OldType = TpFloat; NewType = int]’:
required from ‘NewType Eigen::internal::cast(const OldType&) [with
OldType = TpFloat; NewType = int]’
/home/peter/Eigen/eigen/Eigen/src/Core/IO.h:132:97:   required from
‘static int Eigen::internal::significant_decimals_default_impl<Scalar,
IsInteger>::run() [with Scalar = TpFloat; bool IsInteger = false]’
/home/peter/Eigen/eigen/Eigen/src/Core/IO.h:180:67:   required from
‘std::ostream& Eigen::internal::print_matrix(std::ostream&, const
Derived&, const Eigen::IOFormat&) [with Derived = Eigen::Matrix<TpFloat,
-1, -1, 1>; std::ostream = std::basic_ostream<char>]’
/home/peter/Eigen/eigen/Eigen/src/Core/IO.h:245:69:   required from
‘std::ostream& Eigen::operator<<(std::ostream&, const
Eigen::DenseBase<Derived>&) [with Derived = Eigen::Matrix<TpFloat, -1,
-1, 1>; std::ostream = std::basic_ostream<char>]’
E.C:78:15:   required from here
/home/peter/Eigen/eigen/Eigen/src/Core/MathFunctions.h:330:34: error:
invalid static_cast from type ‘const TpFloat’ to type ‘int’
      return static_cast<NewType>(x);

Is it necessary to define a cast from the user defined type to int?
I'm using g++ v. 4.8 and eigen v. 3.2.9.

Any help is appreciated,
thanks in advance,

 Dipl. Inf., Dipl. Math. Christoph Hertzberg

 Universität Bremen
 FB 3 - Mathematik und Informatik
 AG Robotik
 Robert-Hooke-Straße 1
 28359 Bremen, Germany

 Zentrale: +49 421 178 45-6611

 Besuchsadresse der Nebengeschäftsstelle:
 Robert-Hooke-Straße 5
 28359 Bremen, Germany

 Tel.:    +49 421 178 45-4021
 Empfang: +49 421 178 45-6600
 Fax:     +49 421 178 45-4150
 E-Mail:  chtz@xxxxxxxxxxxxxxxxxxxxxxxx

 Weitere Informationen:

Mail converted by MHonArc 2.6.19+