为什么我不能继承自Eigen :: Matrix?

时间:2019-10-30 17:12:55

标签: c++ c++11 templates eigen3

我有this类:

template < unsigned N, typename T >
class MY_EXPORT my_point : protected Eigen::Matrix< T, N, 1 >
{
public:
  using vector_type = Eigen::Matrix< T, N, 1 >;

  my_point() : vector_type{ vector_type::Zero() } {}
  using vector_type::vector_type;
};

我的Linux(GCC)构建很好。但是,在Windows(MSVC 15.9.16)上,我得到really strange errors

c:\include\eigen3\eigen\src\core\densebase.h(482): error C2338: THIS_METHOD_IS_ONLY_FOR_1x1_EXPRESSIONS (compiling source file c:\code\my_point.cxx) [C:\workspace\KwiverWindows\build\vital\vital.vcxproj]
  c:\include\eigen3\eigen\src\core\densebase.h(481): note: while compiling class template member function 'const float &Eigen::DenseBase<Derived>::value(void) const'
          with
          [
              Derived=Eigen::Matrix<float,4,1,0,4,1>
          ] (compiling source file c:\code\my_point.cxx)
  c:\include\eigen3\eigen\src\core\matrixbase.h(50): note: see reference to class template instantiation 'Eigen::DenseBase<Derived>' being compiled
          with
          [
              Derived=Eigen::Matrix<float,4,1,0,4,1>
          ] (compiling source file c:\code\my_point.cxx)
  c:\include\eigen3\eigen\src\core\plainobjectbase.h(100): note: see reference to class template instantiation 'Eigen::MatrixBase<Derived>' being compiled
          with
          [
              Derived=Eigen::Matrix<float,4,1,0,4,1>
          ] (compiling source file c:\code\my_point.cxx)
  c:\include\eigen3\eigen\src\core\matrix.h(180): note: see reference to class template instantiation 'Eigen::PlainObjectBase<Eigen::Matrix<float,4,1,0,4,1>>' being compiled (compiling source file c:\code\my_point.cxx)

看起来编译器正在尝试实例化不适当的方法(例如,稍后的错误试图针对3个向量实例化w())。我究竟做错了什么? (为什么直接使用Eigen::Matrix时这不是问题?)

Here是现场演示。

1 个答案:

答案 0 :(得分:0)

问题在于Eigen不使用SFINAE / enable_if隐藏“不适当的”成员,而只是依赖于它们从未被实例化(如果有人尝试使用它们,则使用静态断言)。结果,无法显式实例化Eigen类(至少为Eigen::Matrix)。

这可以用一个简单的例子看出来:

#include <Eigen/Core>
template class Eigen::Matrix< double, 3, 1 >;

Live demo

真正的奥秘在于,为什么GCC允许显式实例化来自Eigen::Matrix的类 。 MSVC并非如此,但似乎MSVC可能在此处。

短期解决方案是不导出my_point。当然,这需要my_point的所有方法的定义在标头中可见,或者被单独导出(而不是尝试导出整个类)。

长期解决方案是修复Eigen,以便可以显式实例化其类型:https://eigen.tuxfamily.org/bz/show_bug.cgi?id=1768