4

私は次のコードを持っています:

void mySetTransform(const Eigen::Affine3d& T);
...
mySetTransform(Eigen::Translation3d(1.0,2.0,3.0));

Eigen::Translation3dこれはコンパイルされず、を に変換できませんEigen::Affine3d。次の行で同じエラーが発生します。

Eigen::Affine3d test = Eigen::Translation3d(r);

しかし、これは問題ありません:

Eigen::Affine3d test;
test = Eigen::Translation3d(r);

そのため、the 演算子は正常に動作しているように見えますが、anを使用し=て構築するコンストラクターは定義されていません。Eigen::Affine3dEigen::Translation3d

ドキュメントには、クラスに関する次の注意事項があります。Translation

このクラスは、平行移動変換を格納するために使用されるのではなく、Transform オブジェクトの構築と更新を容易にすることを目的としています。

Translation上記の関数を宣言して、Eigen/Geomerty で宣言されているような変換オブジェクトを使用して (一時変数を使用せずに) 直接呼び出す方法はありますか?

4

1 に答える 1

3

これは、Transform from a Translation のコンストラクタが明示的であるためです。したがって、明示的に呼び出す必要があります。

Translation3d t(1.0,2.0,3.0);
mySetTransform(Affine3f(t));

次の 2 つの例を考えてみましょう。

Affine3d test1(t);  // OK
Affine3d test2 = t; // NOT OK

どちらの場合も (operator= ではなく) 呼び出されるコンストラクターですが、最初のコンストラクターのみが明示的なコンストラクターで問題ありません。これは標準の C++ ルールです。もちろん、次のこともできます。

Affine3d test3 = Affine3d(t); // OK
于 2014-06-17T07:39:53.427 に答える