[eigen] Re: 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 ]


Dear All,

Some more notes from testing the Eigen source.  I've identified the
template parameter which triggers 'does not match the template
parameter "class T"', it is the following line in
ForwardDeclarations.h:

template<typename T> struct ei_traits;

Somehow the compiler is tripping on the ei_traits declarations and
definitions, but it's not clear to me in what manner.

A

On Wed, Jan 27, 2010 at 12:15 PM, Aron Ahmadia <aja2111@xxxxxxxxxxxx> wrote:
> 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/