aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Jitse Niesen <jitse@maths.leeds.ac.uk>2013-08-02 22:33:12 +0100
committerGravatar Jitse Niesen <jitse@maths.leeds.ac.uk>2013-08-02 22:33:12 +0100
commit8fdffdd573e6d36b04cde595460887dd4e1a2340 (patch)
tree2668361a54e538daaf60c5bc72590f17305547c7
parent3444f06f684ca10df70b29af812e8f0c572a709a (diff)
Move inheritance from Eigen example in stand-alone file.
Also fix a small mistake (Vector3d instead of VectorXd).
-rw-r--r--doc/CustomizingEigen.dox57
-rw-r--r--doc/TemplateKeyword.dox3
-rw-r--r--doc/examples/CustomizingEigen_Inheritance.cpp30
3 files changed, 49 insertions, 41 deletions
diff --git a/doc/CustomizingEigen.dox b/doc/CustomizingEigen.dox
index 5a0890ea9..0850863aa 100644
--- a/doc/CustomizingEigen.dox
+++ b/doc/CustomizingEigen.dox
@@ -72,55 +72,32 @@ Then one can the following declaration in the config.h or whatever prerequisites
\section InheritingFromMatrix Inheriting from Matrix
-Before inheriting from Matrix, be really, i mean REALLY sure that using
+Before inheriting from Matrix, be really, I mean REALLY, sure that using
EIGEN_MATRIX_PLUGIN is not what you really want (see previous section).
If you just need to add few members to Matrix, this is the way to go.
-An example of when you actually need to inherit Matrix, is when you have
-several layers of heritage such as MyVerySpecificVector1,MyVerySpecificVector1 -> MyVector1 -> Matrix and.
-MyVerySpecificVector3,MyVerySpecificVector4 -> MyVector2 -> Matrix.
+An example of when you actually need to inherit Matrix, is when you
+have several layers of heritage such as
+MyVerySpecificVector1, MyVerySpecificVector2 -> MyVector1 -> Matrix and
+MyVerySpecificVector3, MyVerySpecificVector4 -> MyVector2 -> Matrix.
In order for your object to work within the %Eigen framework, you need to
define a few members in your inherited class.
-Here is a minimalistic example:\n
-\code
-class MyVectorType : public Eigen::VectorXd
-{
-public:
- MyVectorType(void):Eigen::VectorXd() {}
-
- typedef Eigen::VectorXd Base;
-
- // This constructor allows you to construct MyVectorType from Eigen expressions
- template<typename OtherDerived>
- MyVectorType(const Eigen::MatrixBase<OtherDerived>& other)
- : Eigen::Vector3d(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;
- }
-};
-\endcode
+Here is a minimalistic example:
+
+\include CustomizingEigen_Inheritance.cpp
+
+Output: \verbinclude CustomizingEigen_Inheritance.out
This is the kind of error you can get if you don't provide those methods
-\code
-error: no match for ‘operator=’ in ‘delta =
-(((Eigen::MatrixBase<Eigen::Matrix<std::complex<float>, 10000, 1, 2, 10000,
-1> >*)(& delta)) + 8u)->Eigen::MatrixBase<Derived>::cwise [with Derived =
-Eigen::Matrix<std::complex<float>, 10000, 1, 2, 10000,
-1>]().Eigen::Cwise<ExpressionType>::operator* [with OtherDerived =
-Eigen::Matrix<std::complex<float>, 10000, 1, 2, 10000, 1>, ExpressionType =
-Eigen::Matrix<std::complex<float>, 10000, 1, 2, 10000, 1>](((const
-Eigen::MatrixBase<Eigen::Matrix<std::complex<float>, 10000, 1, 2, 10000, 1>
->&)(((const Eigen::MatrixBase<Eigen::Matrix<std::complex<float>, 10000, 1,
->2, 10000, 1> >*)((const spectral1d*)where)) + 8u)))’
-\endcode
+\verbatim
+error: no match for ‘operator=’ in ‘v = Eigen::operator*(
+const Eigen::MatrixBase<Eigen::Matrix<double, -0x000000001, 1, 0, -0x000000001, 1> >::Scalar&,
+const Eigen::MatrixBase<Eigen::Matrix<double, -0x000000001, 1> >::StorageBaseType&)
+(((const Eigen::MatrixBase<Eigen::Matrix<double, -0x000000001, 1> >::StorageBaseType&)
+((const Eigen::MatrixBase<Eigen::Matrix<double, -0x000000001, 1> >::StorageBaseType*)(& v))))’
+\endverbatim
\anchor user_defined_scalars \section CustomScalarType Using custom scalar types
diff --git a/doc/TemplateKeyword.dox b/doc/TemplateKeyword.dox
index f4e4f237e..c9944ae05 100644
--- a/doc/TemplateKeyword.dox
+++ b/doc/TemplateKeyword.dox
@@ -5,7 +5,8 @@ namespace Eigen {
There are two uses for the \c template and \c typename keywords in C++. One of them is fairly well known
amongst programmers: to define templates. The other use is more obscure: to specify that an expression refers
to a template function or a type. This regularly trips up programmers that use the %Eigen library, often
-leading to error messages from the compiler that are difficult to understand.
+leading to error messages from the compiler that are difficult to understand, such as "expected expression" or
+"no match for operator<".
\eigenAutoToc
diff --git a/doc/examples/CustomizingEigen_Inheritance.cpp b/doc/examples/CustomizingEigen_Inheritance.cpp
new file mode 100644
index 000000000..48df64ee3
--- /dev/null
+++ b/doc/examples/CustomizingEigen_Inheritance.cpp
@@ -0,0 +1,30 @@
+#include <Eigen/Core>
+#include <iostream>
+
+class MyVectorType : public Eigen::VectorXd
+{
+public:
+ MyVectorType(void):Eigen::VectorXd() {}
+
+ // This constructor allows you to construct MyVectorType from Eigen expressions
+ template<typename OtherDerived>
+ MyVectorType(const Eigen::MatrixBase<OtherDerived>& other)
+ : Eigen::VectorXd(other)
+ { }
+
+ // This method allows you to assign Eigen expressions to MyVectorType
+ template<typename OtherDerived>
+ MyVectorType& operator=(const Eigen::MatrixBase <OtherDerived>& other)
+ {
+ this->Eigen::VectorXd::operator=(other);
+ return *this;
+ }
+};
+
+int main()
+{
+ MyVectorType v = MyVectorType::Ones(4);
+ v(2) += 10;
+ v = 2 * v;
+ std::cout << v.transpose() << std::endl;
+}