扩展自己的引用 class
Extending Eigen Ref class
我正在尝试扩展 Ref Eigen
class 以便使用自定义 classes。我有以下代码:
#include <iostream>
#include <eigen3/Eigen/Dense>
class Interface {
public:
virtual ~Interface() {
}
virtual void customMethod() const = 0;
};
class MyVectorType: public Eigen::Matrix<double, 3, 1, Eigen::DontAlign>,
public Interface {
public:
MyVectorType(void) :
Eigen::Matrix<double, 3, 1, Eigen::DontAlign>() {
}
typedef Eigen::Matrix<double, 3, 1, Eigen::DontAlign> 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, Eigen::DontAlign>(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;
}
virtual void customMethod() const {
std::cout << rows() << std::endl;
}
};
template<typename T, int Options>
class MyRef: public Eigen::Ref<typename T::Base, Options, Eigen::Stride<0, 0> >,
public Interface {
public:
typedef Eigen::Ref<typename T::Base, Options, Eigen::Stride<0, 0> > Base;
template<typename Derived>
MyRef(Eigen::DenseBase<Derived>& expr) :
Eigen::Ref<typename T::Base, Options, Eigen::Stride<0, 0> >(expr) {
}
virtual void customMethod() const {
std::cout << rows() << std::endl; // <-----error
}
EIGEN_INHERIT_ASSIGNMENT_OPERATORS(MyRef)};
template<typename T, int Options>
class MyRef<const T, Options> : public Eigen::Ref<typename T::Base, Options,
Eigen::Stride<0, 0> >, public Interface {
public:
template<typename Derived>
MyRef(const Eigen::DenseBase<Derived>& expr) :
Eigen::Ref<typename T::Base, Options, Eigen::Stride<0, 0> >(expr) {
}
virtual void customMethod() const {
std::cout << rows() << std::endl; // <-----error
}
};
void init(MyRef<MyVectorType, Eigen::Unaligned> m) {
m.customMethod();
}
int main() {
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::AutoAlign, 12,
12> mm(3, 1);
Eigen::Map<MyVectorType::Base> map(mm.data(), 3, 1);
MyRef<MyVectorType, Eigen::Unaligned> ref(map);
init(ref);
std::cout << mm << std::endl;
return 0;
}
为了像方法 init()
一样调用自定义方法,必须在 MyVectorType
和 MyRef
之间使用相同的接口。所以我想使用 Interface
class。
问题:此代码无法编译,因为我无法在 MyRef
中调用 rows()
,所以我不明白如何访问 MyVectorType
或底层Ref
class 中的数据调用其他方法。
我尝试使用 derived()
访问,但它不起作用。看了源码,不明白Ref
怎么能和DenseBase
的所有接口正常使用。我想为我的自定义方法做同样的事情。
Gcc 错误:
../main.cpp:49:16: error: there are no arguments to ‘rows’ that depend on a template parameter, so a declaration of ‘rows’ must be available [-fpermissive]
std::cout << rows() << std::endl;
^~~~
../main.cpp:49:16: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
../main.cpp: In member function ‘virtual void MyRef<const T, Options>::customMethod() const’:
../main.cpp:63:16: error: there are no arguments to ‘rows’ that depend on a template parameter, so a declaration of ‘rows’ must be available [-fpermissive]
std::cout << rows() << std::endl;
^~~~
当 Base
class 依赖于模板参数时,即使 Derived
(比方说)member_base
继承自 Base
,只需使用member_base
在 Derived
class 中不等同于 this->member_base
.
也就是
template<typename T>
class Base { public: void member_base(); };
template<typename T>
class Derived : Base<T>
{
public:
void member_derived()
{
member_base(); // calls external(global) member_base() or error
}
};
在你的情况下,rows()
的情况与上述情况完全相同。
您需要使用 this->
或 Base<T>::
为您从 Base
继承的所有成员取得资格。
你的情况
this->row()
或
Eigen::Ref<typename T::Base, Options, Eigen::Stride<0, 0> >::rows()
我正在尝试扩展 Ref Eigen
class 以便使用自定义 classes。我有以下代码:
#include <iostream>
#include <eigen3/Eigen/Dense>
class Interface {
public:
virtual ~Interface() {
}
virtual void customMethod() const = 0;
};
class MyVectorType: public Eigen::Matrix<double, 3, 1, Eigen::DontAlign>,
public Interface {
public:
MyVectorType(void) :
Eigen::Matrix<double, 3, 1, Eigen::DontAlign>() {
}
typedef Eigen::Matrix<double, 3, 1, Eigen::DontAlign> 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, Eigen::DontAlign>(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;
}
virtual void customMethod() const {
std::cout << rows() << std::endl;
}
};
template<typename T, int Options>
class MyRef: public Eigen::Ref<typename T::Base, Options, Eigen::Stride<0, 0> >,
public Interface {
public:
typedef Eigen::Ref<typename T::Base, Options, Eigen::Stride<0, 0> > Base;
template<typename Derived>
MyRef(Eigen::DenseBase<Derived>& expr) :
Eigen::Ref<typename T::Base, Options, Eigen::Stride<0, 0> >(expr) {
}
virtual void customMethod() const {
std::cout << rows() << std::endl; // <-----error
}
EIGEN_INHERIT_ASSIGNMENT_OPERATORS(MyRef)};
template<typename T, int Options>
class MyRef<const T, Options> : public Eigen::Ref<typename T::Base, Options,
Eigen::Stride<0, 0> >, public Interface {
public:
template<typename Derived>
MyRef(const Eigen::DenseBase<Derived>& expr) :
Eigen::Ref<typename T::Base, Options, Eigen::Stride<0, 0> >(expr) {
}
virtual void customMethod() const {
std::cout << rows() << std::endl; // <-----error
}
};
void init(MyRef<MyVectorType, Eigen::Unaligned> m) {
m.customMethod();
}
int main() {
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::AutoAlign, 12,
12> mm(3, 1);
Eigen::Map<MyVectorType::Base> map(mm.data(), 3, 1);
MyRef<MyVectorType, Eigen::Unaligned> ref(map);
init(ref);
std::cout << mm << std::endl;
return 0;
}
为了像方法 init()
一样调用自定义方法,必须在 MyVectorType
和 MyRef
之间使用相同的接口。所以我想使用 Interface
class。
问题:此代码无法编译,因为我无法在 MyRef
中调用 rows()
,所以我不明白如何访问 MyVectorType
或底层Ref
class 中的数据调用其他方法。
我尝试使用 derived()
访问,但它不起作用。看了源码,不明白Ref
怎么能和DenseBase
的所有接口正常使用。我想为我的自定义方法做同样的事情。
Gcc 错误:
../main.cpp:49:16: error: there are no arguments to ‘rows’ that depend on a template parameter, so a declaration of ‘rows’ must be available [-fpermissive]
std::cout << rows() << std::endl;
^~~~
../main.cpp:49:16: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
../main.cpp: In member function ‘virtual void MyRef<const T, Options>::customMethod() const’:
../main.cpp:63:16: error: there are no arguments to ‘rows’ that depend on a template parameter, so a declaration of ‘rows’ must be available [-fpermissive]
std::cout << rows() << std::endl;
^~~~
当 Base
class 依赖于模板参数时,即使 Derived
(比方说)member_base
继承自 Base
,只需使用member_base
在 Derived
class 中不等同于 this->member_base
.
也就是
template<typename T>
class Base { public: void member_base(); };
template<typename T>
class Derived : Base<T>
{
public:
void member_derived()
{
member_base(); // calls external(global) member_base() or error
}
};
在你的情况下,rows()
的情况与上述情况完全相同。
您需要使用 this->
或 Base<T>::
为您从 Base
继承的所有成员取得资格。
你的情况
this->row()
或
Eigen::Ref<typename T::Base, Options, Eigen::Stride<0, 0> >::rows()