[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
]
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: [eigen] XLC Port: Part II - External definition of a template member function of a template class causing the problems?
- From: Aron Ahmadia <aja2111@xxxxxxxxxxxx>
- Date: Wed, 27 Jan 2010 12:15:20 +0300
- Cc: Alexandre Eichenberger <alexe@xxxxxxxxxx>, John A Gunnels <gunnels@xxxxxxxxxx>, aron.ahmadia@xxxxxxxxxxxx
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:date :x-google-sender-auth:message-id:subject:from:to:cc:content-type; bh=Bu7X/hrb+4+L9xPq3g8ymIDKsZ2aFEBuJKFyqChILfw=; b=uQlJOP5DTRL2d35lOIWMx2Pztg7EyPEZUP3phojuk7KYK9VlpcrIEPRjy5sbCFL6qV yNKob86BYoYo6WURTX4jpA3x4Cp4Gh/inG8FuvZflshlsE24IwSjmB9M2bZ2hD+b3pbk HjY2v328Bspw2eGLhuNZUfyCAtAHmW2mSuVbc=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:cc:content-type; b=VOIiQ9oAN7QVEBZKmmFgO2H1LUhuwjf1+kx4wJdEUR3QzmpSD/NfjQdCwySbBOyJ2Q 7PDEyqdoBoBiwen1qHPaCpWdwoW6RmVXzlmV//m1EAK8El+ZIihrV8GboP8CDUSfnnqw gtmVU3OXxk90ZG/ORMEs52c0NRWbtXzlXoFls=
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