代码之家  ›  专栏  ›  技术社区  ›  greywolf82

具有子矩阵类的特征ref

  •  0
  • greywolf82  · 技术社区  · 6 年前

    我有以下代码:

    #include <iostream>
    #include <eigen3/Eigen/Dense>
    
    class MyVectorType: public Eigen::Matrix<double, 3, 1> {
    public:
        MyVectorType(void) :
                Eigen::Matrix<double, 3, 1>() {
        }
        typedef Eigen::Matrix<double, 3, 1> Base;
        // This constructor allows you to construct MyVectorType from Eigen expressions
        template<typename OtherDerived>
        MyVectorType(const Eigen::MatrixBase<OtherDerived>& other) :
                Eigen::Matrix<double, 3, 1>(other) {
        }
        // This method allows you to assign Eigen expressions to MyVectorType
        template<typename OtherDerived>
        MyVectorType & operator=(const Eigen::MatrixBase<OtherDerived>& other) {
            this->Base::operator=(other);
            return *this;
        }
        //other custom methods here
    };
    
    void init(Eigen::Ref<MyVectorType>& m) {
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 1; j++)
                m(i, j) = 1;
    }
    
    int main() {
        Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::AutoAlign, 12,
                12> mm(3, 1);
        Eigen::Ref<MyVectorType> rr(mm);
        init(rr);
        std::cout << mm << std::endl;
        return 0;
    }
    

    make all 
    Building file: ../main.cpp
    Invoking: GCC C++ Compiler
    g++ -std=c++98 -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.o" -o "main.o" "../main.cpp"
    In file included from /usr/include/eigen3/Eigen/Core:449:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/Map.h: In instantiation of ‘struct Eigen::internal::traits<Eigen::Map<MyVectorType, 0, Eigen::OuterStride<> > >’:
    /usr/include/eigen3/Eigen/src/Core/Ref.h:18:8:   required from ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
    /usr/include/eigen3/Eigen/src/Core/util/ForwardDeclarations.h:32:54:   required from ‘struct Eigen::internal::accessors_level<Eigen::Ref<MyVectorType> >’
    /usr/include/eigen3/Eigen/src/Core/util/ForwardDeclarations.h:113:75:   required from ‘class Eigen::RefBase<Eigen::Ref<MyVectorType> >’
    /usr/include/eigen3/Eigen/src/Core/Ref.h:190:76:   required from ‘class Eigen::Ref<MyVectorType>’
    ../main.cpp:26:10:   required from here
    /usr/include/eigen3/Eigen/src/Core/Map.h:18:8: error: invalid use of incomplete type ‘struct Eigen::internal::traits<MyVectorType>’
     struct traits<Map<PlainObjectType, MapOptions, StrideType> >
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In file included from /usr/include/eigen3/Eigen/Core:346:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/util/ForwardDeclarations.h:17:29: note: declaration of ‘struct Eigen::internal::traits<MyVectorType>’
     template<typename T> struct traits;
                                 ^~~~~~
    In file included from /usr/include/eigen3/Eigen/Core:449:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/Map.h:30:32: error: incomplete type ‘Eigen::internal::traits<Eigen::Map<MyVectorType, 0, Eigen::OuterStride<> > >::TraitsBase {aka Eigen::internal::traits<MyVectorType>}’ used in nested name specifier
         Flags0 = TraitsBase::Flags & (~NestByRefBit),
                  ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
    In file included from /usr/include/eigen3/Eigen/Core:348:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/util/XprHelper.h: In instantiation of ‘struct Eigen::internal::is_lvalue<MyVectorType>’:
    /usr/include/eigen3/Eigen/src/Core/Map.h:31:47:   required from ‘struct Eigen::internal::traits<Eigen::Map<MyVectorType, 0, Eigen::OuterStride<> > >’
    /usr/include/eigen3/Eigen/src/Core/Ref.h:18:8:   required from ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
    /usr/include/eigen3/Eigen/src/Core/util/ForwardDeclarations.h:32:54:   required from ‘struct Eigen::internal::accessors_level<Eigen::Ref<MyVectorType> >’
    /usr/include/eigen3/Eigen/src/Core/util/ForwardDeclarations.h:113:75:   required from ‘class Eigen::RefBase<Eigen::Ref<MyVectorType> >’
    /usr/include/eigen3/Eigen/src/Core/Ref.h:190:76:   required from ‘class Eigen::Ref<MyVectorType>’
    ../main.cpp:26:10:   required from here
    /usr/include/eigen3/Eigen/src/Core/util/XprHelper.h:642:53: error: incomplete type ‘Eigen::internal::traits<MyVectorType>’ used in nested name specifier
                      bool(traits<ExpressionType>::Flags & LvalueBit) };
                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
    In file included from /usr/include/eigen3/Eigen/Core:448:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/MapBase.h: In instantiation of ‘class Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>’:
    /usr/include/eigen3/Eigen/src/Core/Ref.h:58:34:   required from ‘class Eigen::RefBase<Eigen::Ref<MyVectorType> >’
    /usr/include/eigen3/Eigen/src/Core/Ref.h:190:76:   required from ‘class Eigen::Ref<MyVectorType>’
    ../main.cpp:26:10:   required from here
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: error: no type named ‘XprKind’ in ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
     template<typename Derived> class MapBase<Derived, ReadOnlyAccessors>
                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:42:62: error: no type named ‘XprKind’ in ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
         typedef typename internal::dense_xpr_base<Derived>::type Base;
                                                                  ^~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:43:10: error: ‘RowsAtCompileTime’ is not a member of ‘Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
         enum {
              ^
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:43:10: error: ‘ColsAtCompileTime’ is not a member of ‘Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:49:61: error: no type named ‘StorageKind’ in ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
         typedef typename internal::traits<Derived>::StorageKind StorageKind;
                                                                 ^~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:50:56: error: no type named ‘Scalar’ in ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
         typedef typename internal::traits<Derived>::Scalar Scalar;
                                                            ^~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:51:60: error: no type named ‘Scalar’ in ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
         typedef typename internal::packet_traits<Scalar>::type PacketScalar;
                                                                ^~~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:52:46: error: no type named ‘Scalar’ in ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
         typedef typename NumTraits<Scalar>::Real RealScalar;
                                                  ^~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:57:22: error: no type named ‘Scalar’ in ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
                          PointerType;
                          ^~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:59:17: error: using-declaration for non-member at class scope
         using Base::derived;
                     ^~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:63:17: error: using-declaration for non-member at class scope
         using Base::MaxRowsAtCompileTime;
                     ^~~~~~~~~~~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:64:17: error: using-declaration for non-member at class scope
         using Base::MaxColsAtCompileTime;
                     ^~~~~~~~~~~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:65:17: error: using-declaration for non-member at class scope
         using Base::MaxSizeAtCompileTime;
                     ^~~~~~~~~~~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:66:17: error: using-declaration for non-member at class scope
         using Base::IsVectorAtCompileTime;
                     ^~~~~~~~~~~~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:67:17: error: using-declaration for non-member at class scope
         using Base::Flags;
                     ^~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:68:17: error: using-declaration for non-member at class scope
         using Base::IsRowMajor;
                     ^~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:70:17: error: using-declaration for non-member at class scope
         using Base::rows;
                     ^~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:71:17: error: using-declaration for non-member at class scope
         using Base::cols;
                     ^~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:72:17: error: using-declaration for non-member at class scope
         using Base::size;
                     ^~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:73:17: error: using-declaration for non-member at class scope
         using Base::coeff;
                     ^~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:74:17: error: using-declaration for non-member at class scope
         using Base::coeffRef;
                     ^~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:75:17: error: using-declaration for non-member at class scope
         using Base::lazyAssign;
                     ^~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:76:17: error: using-declaration for non-member at class scope
         using Base::eval;
                     ^~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:78:17: error: using-declaration for non-member at class scope
         using Base::innerStride;
                     ^~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:79:17: error: using-declaration for non-member at class scope
         using Base::outerStride;
                     ^~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:80:17: error: using-declaration for non-member at class scope
         using Base::rowStride;
                     ^~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:81:17: error: using-declaration for non-member at class scope
         using Base::colStride;
                     ^~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:84:25: error: using-declaration for non-member at class scope
         using Base::operator=;
                             ^
    In file included from /usr/include/eigen3/Eigen/Core:72:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/Ref.h: In instantiation of ‘class Eigen::RefBase<Eigen::Ref<MyVectorType> >’:
    /usr/include/eigen3/Eigen/src/Core/Ref.h:190:76:   required from ‘class Eigen::Ref<MyVectorType>’
    ../main.cpp:26:10:   required from here
    /usr/include/eigen3/Eigen/src/Core/Ref.h:67:3: error: no type named ‘Scalar’ in ‘struct Eigen::internal::traits<Eigen::RefBase<Eigen::Ref<MyVectorType> > >’
       EIGEN_DENSE_PUBLIC_INTERFACE(RefBase)
       ^
    /usr/include/eigen3/Eigen/src/Core/Ref.h:67:3: error: no type named ‘Scalar’ in ‘struct Eigen::internal::traits<Eigen::RefBase<Eigen::Ref<MyVectorType> > >’
       EIGEN_DENSE_PUBLIC_INTERFACE(RefBase)
       ^
    In file included from /usr/include/eigen3/Eigen/Core:72:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/Ref.h:67:3: error: no type named ‘StorageKind’ in ‘struct Eigen::internal::traits<Eigen::RefBase<Eigen::Ref<MyVectorType> > >’
       EIGEN_DENSE_PUBLIC_INTERFACE(RefBase)
       ^
    /usr/include/eigen3/Eigen/src/Core/Ref.h:67:3: error: no type named ‘StorageIndex’ in ‘struct Eigen::internal::traits<Eigen::RefBase<Eigen::Ref<MyVectorType> > >’
       EIGEN_DENSE_PUBLIC_INTERFACE(RefBase)
       ^
    /usr/include/eigen3/Eigen/src/Core/Ref.h:67:3: error: ‘RowsAtCompileTime’ is not a member of ‘Eigen::internal::traits<Eigen::RefBase<Eigen::Ref<MyVectorType> > >’
       EIGEN_DENSE_PUBLIC_INTERFACE(RefBase)
       ^
    /usr/include/eigen3/Eigen/src/Core/Ref.h:67:3: error: ‘ColsAtCompileTime’ is not a member of ‘Eigen::internal::traits<Eigen::RefBase<Eigen::Ref<MyVectorType> > >’
    /usr/include/eigen3/Eigen/src/Core/Ref.h:67:3: error: ‘MaxSizeAtCompileTime’ is not a member of ‘Eigen::RefBase<Eigen::Ref<MyVectorType> >::Base {aka Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>}’
    /usr/include/eigen3/Eigen/src/Core/Ref.h:67:3: error: ‘IsVectorAtCompileTime’ is not a member of ‘Eigen::RefBase<Eigen::Ref<MyVectorType> >::Base {aka Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>}’
    /usr/include/eigen3/Eigen/src/Core/Ref.h:67:3: error: no members matching ‘Eigen::RefBase<Eigen::Ref<MyVectorType> >::Base {aka Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>}::derived’ in ‘Eigen::RefBase<Eigen::Ref<MyVectorType> >::Base {aka class Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>}’
       EIGEN_DENSE_PUBLIC_INTERFACE(RefBase)
       ^
    /usr/include/eigen3/Eigen/src/Core/Ref.h:67:3: error: no members matching ‘Eigen::RefBase<Eigen::Ref<MyVectorType> >::Base {aka Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>}::const_cast_derived’ in ‘Eigen::RefBase<Eigen::Ref<MyVectorType> >::Base {aka class Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>}’
       EIGEN_DENSE_PUBLIC_INTERFACE(RefBase)
       ^
    In file included from /usr/include/eigen3/Eigen/Core:72:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/Ref.h: In instantiation of ‘class Eigen::Ref<MyVectorType>’:
    ../main.cpp:26:10:   required from here
    /usr/include/eigen3/Eigen/src/Core/Ref.h:201:5: error: no type named ‘Scalar’ in ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
         EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
         ^
    /usr/include/eigen3/Eigen/src/Core/Ref.h:201:5: error: no type named ‘Scalar’ in ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
         EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
         ^
    In file included from /usr/include/eigen3/Eigen/Core:72:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/Ref.h:201:5: error: no type named ‘StorageKind’ in ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
         EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
         ^
    /usr/include/eigen3/Eigen/src/Core/Ref.h:201:5: error: no type named ‘StorageIndex’ in ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
         EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
         ^
    /usr/include/eigen3/Eigen/src/Core/Ref.h:201:5: error: ‘RowsAtCompileTime’ is not a member of ‘Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
         EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
         ^
    /usr/include/eigen3/Eigen/src/Core/Ref.h:201:5: error: ‘ColsAtCompileTime’ is not a member of ‘Eigen::internal::traits<Eigen::Ref<MyVectorType> >’
    /usr/include/eigen3/Eigen/src/Core/Ref.h:201:5: error: no members matching ‘Eigen::Ref<MyVectorType>::Base {aka Eigen::RefBase<Eigen::Ref<MyVectorType> >}::derived’ in ‘Eigen::Ref<MyVectorType>::Base {aka class Eigen::RefBase<Eigen::Ref<MyVectorType> >}’
         EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
         ^
    /usr/include/eigen3/Eigen/src/Core/Ref.h:201:5: error: no members matching ‘Eigen::Ref<MyVectorType>::Base {aka Eigen::RefBase<Eigen::Ref<MyVectorType> >}::const_cast_derived’ in ‘Eigen::Ref<MyVectorType>::Base {aka class Eigen::RefBase<Eigen::Ref<MyVectorType> >}’
         EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
         ^
    ../main.cpp: In function ‘void init(Eigen::Ref<MyVectorType>&)’:
    ../main.cpp:26:10: error: no match for call to ‘(Eigen::Ref<MyVectorType>) (int&, int&)’
        m(i, j) = 1;
              ^
    In file included from /usr/include/eigen3/Eigen/Core:450:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/Ref.h: In instantiation of ‘struct Eigen::internal::traits<Eigen::Ref<MyVectorType> >::match<Eigen::Matrix<double, -1, -1, 0, 12, 12> >’:
    /usr/include/eigen3/Eigen/src/Core/Ref.h:197:63:   required by substitution of ‘template<class Derived> Eigen::Ref<MyVectorType>::Ref(const Eigen::PlainObjectBase<Derived>&, typename Eigen::internal::enable_if<(bool)(Eigen::internal::traits<Eigen::Ref<MyVectorType> >::match<Derived>::MatchAtCompileTime), Derived>::type*) [with Derived = Eigen::Matrix<double, -1, -1, 0, 12, 12>]’
    ../main.cpp:32:32:   required from here
    /usr/include/eigen3/Eigen/src/Core/Ref.h:44:25: error: incomplete type ‘Eigen::internal::traits<MyVectorType>’ used in nested name specifier
           AlignmentMatch = (int(traits<PlainObjectType>::Alignment)==int(Unaligned)) || (DerivedAlignment >= int(Alignment)), // FIXME the first condition is not very clear, it should be replaced by the required alignment
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In file included from /usr/include/eigen3/Eigen/Core:347:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h: In instantiation of ‘static void Eigen::PlainObjectBase<Derived>::_check_template_params() [with Derived = Eigen::Matrix<double, 3, 1, 0, 12, 12>]’:
    /usr/include/eigen3/Eigen/src/Core/Matrix.h:261:35:   required from ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Matrix() [with _Scalar = double; int _Rows = 3; int _Cols = 1; int _Options = 0; int _MaxRows = 12; int _MaxCols = 12]’
    ../main.cpp:7:58:   required from here
    /usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:899:7: error: ‘INVALID_MATRIX_TEMPLATE_PARAMETERS’ is not a member of ‘Eigen::internal::static_assertion<false>’
           EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, (Options&RowMajor)==RowMajor)
           ^
    In file included from /usr/include/eigen3/Eigen/Core:450:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/Ref.h: In instantiation of ‘Eigen::RefBase<Derived>::RefBase() [with Derived = Eigen::Ref<MyVectorType>]’:
    /usr/include/eigen3/Eigen/src/Core/Ref.h:208:5:   required from ‘Eigen::Ref<PlainObjectType, Options, StrideType>::Ref(Eigen::PlainObjectBase<OtherDerived>&, typename Eigen::internal::enable_if<(bool)(typename Eigen::internal::traits<Eigen::Ref<PlainObjectType, RefOptions, StrideType> >::match<Derived>::MatchAtCompileTime), Derived>::type*) [with Derived = Eigen::Matrix<double, -1, -1, 0, 12, 12>; PlainObjectType = MyVectorType; int Options = 0; StrideType = Eigen::OuterStride<>; typename Eigen::internal::enable_if<(bool)(typename Eigen::internal::traits<Eigen::Ref<PlainObjectType, RefOptions, StrideType> >::match<Derived>::MatchAtCompileTime), Derived>::type = Eigen::Matrix<double, -1, -1, 0, 12, 12>]’
    ../main.cpp:32:32:   required from here
    /usr/include/eigen3/Eigen/src/Core/Ref.h:86:100: error: no matching function for call to ‘Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>::MapBase(int, int, int)’
                    StrideType::InnerStrideAtCompileTime==Dynamic?0:StrideType::InnerStrideAtCompileTime)
                                                                                                        ^
    In file included from /usr/include/eigen3/Eigen/Core:448:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note: candidate: Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>::MapBase()
     template<typename Derived> class MapBase<Derived, ReadOnlyAccessors>
                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note:   candidate expects 0 arguments, 3 provided
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note: candidate: Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>::MapBase(const Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>&)
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note:   candidate expects 1 argument, 3 provided
    In file included from /usr/include/eigen3/Eigen/Core:450:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/Ref.h: In instantiation of ‘void Eigen::RefBase<Derived>::construct(Expression&) [with Expression = Eigen::Matrix<double, -1, -1, 0, 12, 12>; Derived = Eigen::Ref<MyVectorType>]’:
    /usr/include/eigen3/Eigen/src/Core/Ref.h:210:22:   required from ‘Eigen::Ref<PlainObjectType, Options, StrideType>::Ref(Eigen::PlainObjectBase<OtherDerived>&, typename Eigen::internal::enable_if<(bool)(typename Eigen::internal::traits<Eigen::Ref<PlainObjectType, RefOptions, StrideType> >::match<Derived>::MatchAtCompileTime), Derived>::type*) [with Derived = Eigen::Matrix<double, -1, -1, 0, 12, 12>; PlainObjectType = MyVectorType; int Options = 0; StrideType = Eigen::OuterStride<>; typename Eigen::internal::enable_if<(bool)(typename Eigen::internal::traits<Eigen::Ref<PlainObjectType, RefOptions, StrideType> >::match<Derived>::MatchAtCompileTime), Derived>::type = Eigen::Matrix<double, -1, -1, 0, 12, 12>]’
    ../main.cpp:32:32:   required from here
    /usr/include/eigen3/Eigen/src/Core/Ref.h:101:7: error: no matching function for call to ‘Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>::MapBase(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, 12, 12> >::Scalar*, int, Eigen::EigenBase<Eigen::Matrix<double, -1, -1, 0, 12, 12> >::Index)’
           ::new (static_cast<Base*>(this)) Base(expr.data(), 1, expr.size());
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In file included from /usr/include/eigen3/Eigen/Core:448:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note: candidate: Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>::MapBase()
     template<typename Derived> class MapBase<Derived, ReadOnlyAccessors>
                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note:   candidate expects 0 arguments, 3 provided
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note: candidate: Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>::MapBase(const Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>&)
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note:   candidate expects 1 argument, 3 provided
    In file included from /usr/include/eigen3/Eigen/Core:450:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/Ref.h:106:7: error: no matching function for call to ‘Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>::MapBase(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, 12, 12> >::Scalar*, Eigen::EigenBase<Eigen::Matrix<double, -1, -1, 0, 12, 12> >::Index, int)’
           ::new (static_cast<Base*>(this)) Base(expr.data(), expr.size(), 1);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In file included from /usr/include/eigen3/Eigen/Core:448:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note: candidate: Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>::MapBase()
     template<typename Derived> class MapBase<Derived, ReadOnlyAccessors>
                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note:   candidate expects 0 arguments, 3 provided
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note: candidate: Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>::MapBase(const Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>&)
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note:   candidate expects 1 argument, 3 provided
    In file included from /usr/include/eigen3/Eigen/Core:450:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/Ref.h:109:7: error: no matching function for call to ‘Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>::MapBase(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, 12, 12> >::Scalar*, Eigen::Index, Eigen::Index)’
           ::new (static_cast<Base*>(this)) Base(expr.data(), expr.rows(), expr.cols());
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In file included from /usr/include/eigen3/Eigen/Core:448:0,
                     from /usr/include/eigen3/Eigen/Dense:1,
                     from ../main.cpp:2:
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note: candidate: Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>::MapBase()
     template<typename Derived> class MapBase<Derived, ReadOnlyAccessors>
                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note:   candidate expects 0 arguments, 3 provided
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note: candidate: Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>::MapBase(const Eigen::MapBase<Eigen::Ref<MyVectorType>, 0>&)
    /usr/include/eigen3/Eigen/src/Core/MapBase.h:37:34: note:   candidate expects 1 argument, 3 provided
    

    是否可以使用自定义子类通过引用将动态矩阵传递给固定矩阵?

    1 回复  |  直到 6 年前
        1
  •  1
  •   chtz    6 年前

    Eigen::Ref 不打算使用自己的自定义类型(这是可能的,但对于这个目的来说很复杂)。简单使用 Eigen::Ref<MyVectorType::Base> . 如果 Ref 是一个L值(即,可写),您应该按值传递它,如下所示

    void init(Eigen::Ref<MyVectorType::Base> m) { 
        // ...
    

    这样,在调用时就不需要手动生成临时 init :

    int main() {
        Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::AutoAlign, 12,
                12> mm(3, 1);
        // Eigen::Ref<MyVectorType> rr(mm); // not necessary!
        init(mm); // implicitly generates a temporary `Ref` object
        // ...
    

    裁判 : https://eigen.tuxfamily.org/dox/classEigen_1_1Ref.html