【发布时间】:2020-09-16 22:58:02
【问题描述】:
所以我偶然发现了 Eigen 的这个编译问题。我正在使用 Eigen 3.3.4 并在 Linux 上使用 gcc 8.4.0 进行编译。
基本上我有一个继承自Eigen::VectorXd 的定义类,看起来像这样
class dVector : public Eigen::VectorXd {
public:
dVector() : Eigen::VectorXd() { setZero(); }
dVector(int n) : Eigen::VectorXd(n) { setZero(); }
dVector(const Eigen::VectorXd& v) : Eigen::VectorXd(v) {}
dVector(const dVector& v) : Eigen::VectorXd(v) {}
dVector& operator=(const Eigen::VectorXd& v) {
Eigen::VectorXd::operator=(v);
return *this;
}
dVector& operator=(const dVector& v) {
Eigen::VectorXd::operator=(v);
return *this;
}
...
};
然后在我的代码中我像这样使用它:
static dVector a(100);
// do something with a
dVector b = -a; // <--- won't compile
dVector b = dVector(-a); <---- compiles
倒数第二行无法编译,给出通常的 Eigen 错误消息:
error: no viable conversion from 'const Eigen::MatrixBase<Eigen::Matrix<double, -1, 1, 0, -1, 1>>::NegativeReturnType'
(aka 'const CwiseUnaryOp<scalar_opposite_op<double>,
const Eigen::Matrix<double, -1, 1, 0, -1, 1> >') to 'dVector'
现在我真正感兴趣的原因是它不能在 Linux 上编译,但它可以在 Windows 上使用 MSVC 编译。
我真的不明白为什么这不能编译,我怀疑它与隐式转换或操作 -a 实际返回的内容有关;也许它不是dVector,而是一个操作树。尚未完全掌握 Eigen 幕后发生的事情。
那么有两个问题:
为什么
dVector b = -a;不编译?MSVC 编译器做了哪些不同的事情来允许它接受 gcc 拒绝的任何内容?
【问题讨论】:
-
从未使用过 eigen,但我知道它使用表达式模板,这就是您在此处实际看到的内容,所以我不确定从他们的容器继承是否是个好主意,是吗?
标签: c++ gcc visual-c++ eigen