Created attachment 418 [details] Bug demonstration programm and patch for fixing the bug Dear Maintainer, the bug can be demonstrated using Hauke's example from http://forum.kde.nl/viewtopic.php?f=74&t=98871 (see enclosed file). The call to Spline2d::derivative<1> is an extension of Hauke's example inserted by me. This call makes this example fail to compile: ---8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<---- $ LANG=C g++ -I/usr/include/eigen3/ eigen-spline-example-from-hauke.cpp In file included from /usr/include/eigen3/Eigen/Core:300:0, from eigen-spline-example-from-hauke.cpp:4: /usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h: In instantiation of 'static void Eigen::PlainObjectBase<Derived>::_check_template_params() [with Derived = Eigen::Array<double, 1, -1, 0, 1, 2>]': /usr/include/eigen3/Eigen/src/Core/Array.h:127:7: required from 'Eigen::Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Array() [with _Scalar = double; int _Rows = 1; int _Cols = -1; int _Options = 0; int _MaxRows = 1; int _MaxCols = 2]' /usr/include/eigen3/unsupported/Eigen/src/Splines/Spline.h:339:70: required from 'typename Eigen::SplineTraits<Eigen::Spline<Scalar, Dim, Degree>, DerivativeOrder>::DerivativeType Eigen::Spline<Scalar, Dim, Degree>::derivatives(Eigen::Spline<Scalar, Dim, Degree>::Scalar, Eigen::DenseIndex) const [with int DerivativeOrder = 1; _Scalar = double; int _Dim = 1; int _Degree = -1; typename Eigen::SplineTraits<Eigen::Spline<Scalar, Dim, Degree>, DerivativeOrder>::DerivativeType = Eigen::Array<double, 1, -1, 0, 1, 2>; Eigen::Spline<Scalar, Dim, Degree>::Scalar = double; Eigen::DenseIndex = int]' eigen-spline-example-from-hauke.cpp:37:98: required from here /usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:654:7: error: 'INVALID_MATRIX_TEMPLATE_PARAMETERS' is not a member of 'Eigen::internal::static_assertion<false>' ---8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<---- This bug can be fixed by changing in /usr/include/eigen3/unsupported/Eigen/src/Splines/SplineFwd.h the DerivativeType from ColMajor to RowMajor (see enclosed patch for details). With this change everything compiles fine: ---8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<---- $ LANG=C g++ -I/usr/include/eigen3/ -include SplineFwd.h eigen-spline-example- from-hauke.cpp && echo $? 0 ---8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<----
The only question is, if someone expects the return type to be column major if it has more than 1 row (or if it is slightly more efficient). This could be achieved by a simple `?:` expression. I assign it to Hauke and let him decide ...
I pushed a fix (though under a misconfigured user name). I took your patch as a starting point and added two changes. First, I did what Christoph suggested. I keep RowMajor order, if possible. The reason is to keep derivative values of the same order close to each other in memory. Second, I also added the fix the the second traits implementation. Thanks for reporting the isssue and I am happy to see the somebody is using the code! Regards, Hauke
Created attachment 586 [details] patch
-- GitLab Migration Automatic Message -- This bug has been migrated to gitlab.com's GitLab instance and has been closed from further activity. You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.com/libeigen/eigen/issues/734.