我有以下代码:
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);
因此,看起来=
运算符工作正常,但未定义构建Eigen::Affine3d
Eigen::Translation3d
的构造函数。
Translation
类的文档跟有note:
此课程的目的不是用于存储翻译 改造,而是使建筑和更容易 转换对象的更新。
有没有办法声明上面的函数,以便可以使用任何变换对象直接调用它,比如在Eigen / Geomerty中声明的Translation
(不使用临时变量)?
答案 0 :(得分:3)
这是因为Translation 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