4

我有以下代码:

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

这不编译,它不能转换Eigen::Translation3dEigen::Affine3d. 以下行导致相同的错误:

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

但这很好:

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

因此,看起来运算符工作正常,但未定义使用 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));

让我们考虑以下两个示例:

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

即使在这两种情况下都是被调用的构造函数(不是 operator=),但对于显式构造函数,只有第一个是可以的。这是标准的 C++ 规则。当然你也可以这样做:

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