0

Eigen::Vector2d をサブクラス化して、ここでは書きません ( 、 など) いくつかの便利なメソッドを用意しMyVec.randomize()ましMyVec.distanceWithThreshold()た。

しかし、新しいベクターに簡単な操作を割り当てようとすると、変換エラーが発生します。私のコードを見てみましょう:

#include <iostream>
#include "Eigen/Core"

class Vec2D : public Eigen::Vector2d {
    public:
        Vec2D() : Eigen::Vector2d() {};
        Vec2D(double x, double y) : Eigen::Vector2d(x,y) {}
};

std::ostream& operator<< (std::ostream &out, Vec2D &cPoint) {
    out << "(" << cPoint.x() << ", " << cPoint.y() << ")";
    return out;
}

int main() {
    // test with base class
    Eigen::Vector2d A = Eigen::Vector2d(0,0);
    Eigen::Vector2d B = Eigen::Vector2d(5,5);
    Eigen::Vector2d C = A - B;
    std::cout << C.x() << " " << C.y() << std::endl;

    // test with my subclassed Vec2D
    Vec2D _A,_B;
    _A = Vec2D(0, 0);
    _B = Vec2D(5, 5);
    std::cout << _A-_B << std::endl; // my stream overload is not called
    std::cout << _A << std::endl; // my stream overload is called

    // now the problem
    Vec2D dudeee = _A - _B;            // if I comment this line, no error
    std::cout << dudee << std::endl;  // if I comment this line, no error

    return 0;
}

エラーは次のとおりです。

test.cpp: In function 'int main()':
test.cpp:34: error: conversion from 'const Eigen::CwiseBinaryOp<Eigen::internal::scalar_difference_op<double>, const Eigen::Matrix<double, 2, 1, 0, 2, 1>, const Eigen::Matrix<double, 2, 1, 0, 2, 1> >' to non-scalar type 'Vec2D' requested
test.cpp:35: error: 'dudee' was not declared in this scope

私は(ストリーム演算子のオーバーロードの呼び出しのために)何らかの方法でVec2Dの通常の演算子(+、- *、/)を上書きする必要があると思いますが、新しいVec2Dオブジェクトを割り当てるために何らかの方法で言っていますが、私はしませんする方法を知っています。いくつかのアドバイス?

4

1 に答える 1

2

コンパイル エラーに関して、C++ ではコンストラクターと代入演算子は自動的に継承されません。このドキュメントを参照してください。特に、Matrix<> クラスのすべてのコンストラクターを再実装し、以下を追加する必要があります。

using Vector2d::operator=; 

代入演算子を転送します。

AB に関しては、その型は CwiseBinaryOp<...> 式です。Vec2D にしたい場合は、キャストする必要があります。

cout << Vec2D(A-B);

最後に、Eigen の API を拡張することが唯一の目的である場合は、Eigen のプラグイン プラグイン メカニズムを使用するのが最善です。次のプラグインが存在します。

  • EIGEN_DENSEBASE_PLUGIN
    • EIGEN_MATRIXBASE_PLUGIN
      • EIGEN_MATRIX_PLUGIN
    • EIGEN_ARRAYBASE_PLUGIN
      • EIGEN_ARRAY_PLUGIN
于 2013-05-12T11:00:46.313 に答える