[eigen] XLC Port: Part II - External definition of a template member function of a template class causing the problems?

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


Hi all,

I'm still looking at the port, and I've managed to narrow down the
problem.  For those of you who've been following along at home, XLC
has been throwing this error when trying to compile the Eigen files:
                                              [0]
"eigen/Eigen/src/Core/SelfAdjointView.h", line 147.81: 1540-0716 (S)
The template argument "Eigen::SelfAdjointView" does not match the
template parameter "class T".
"eigen/Eigen/src/Core/SelfAdjointView.h", line 134.112: 1540-0716 (S)
The template argument "Eigen::SelfAdjointView" does not match the
template parameter "class T".

Suspiciously, there's no trace of SelfAdjointView being used as a
template parameter argument anywhere in there, or any trace of a
parameter named 'class T'.

So I decided to create a new test file, slowly adding in the Eigen
header files from Core until I got compiler errors.  Here's the
current file: http://pastebin.com/m267235e7

If you'll notice, SelfAdjointView.h is being successfully included
here.  What causes the breakage is SelfadjointProduct.h.  This
actually isn't that surprising, since a function that declared in
SelfAdjointView.h is later defined in SelfadjointProduct.h (By the
way, should this be renamed to SelfAdjointProduct.h to fit the rest of
the naming scheme better?)

Here is the declaration and the definition:

template<typename DerivedU>
SelfAdjointView& rankUpdate(const MatrixBase<DerivedU>& u, Scalar alpha)


template<typename MatrixType, unsigned int UpLo>
template<typename DerivedU>
SelfAdjointView<MatrixType,UpLo>& SelfAdjointView<MatrixType,UpLo>
::rankUpdate(const MatrixBase<DerivedU>& u, Scalar alpha)
{
  typedef ei_blas_traits<DerivedU> UBlasTraits;
  typedef typename UBlasTraits::DirectLinearAccessType ActualUType;
  typedef typename ei_cleantype<ActualUType>::type _ActualUType;
  const ActualUType actualU = UBlasTraits::extract(u.derived());

  Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived());

  enum { IsRowMajor = (ei_traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0 };

  ei_selfadjoint_product<Scalar,
    _ActualUType::Flags&RowMajorBit ? RowMajor : ColMajor,
    ei_traits<MatrixType>::Flags&RowMajorBit ? RowMajor : ColMajor,
    !UBlasTraits::NeedToConjugate, UpLo>
    ::run(_expression().cols(), actualU.cols(), &actualU.coeff(0,0),
actualU.stride(),
          const_cast<Scalar*>(_expression().data()),
_expression().stride(), actualAlpha);

  return *this;
}

So according to this page here:
http://www.comeaucomputing.com/techtalk/templates

You're not allowed to do the above because SelfAdjointView is the
'primary template argument'.  Unfortunately, the code refuses to
compile if the template arguments are removed.

However, inlining the above definition in the class template header
file makes the compiler happy, so we've at least identified where
things are going wrong.  If somebody has an idea what else might
please the compiler, I'm happy for more input.

Obviously, templates are not my strength, so I'm interested in
whatever thoughts anybody has, even if it sounds dumb :)

Thanks,
Aron



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/