【问题标题】:Invert a Eigen::VectorXd and assign to another Eigen::VectorXd反转一个 Eigen::VectorXd 并分配给另一个 Eigen::VectorXd
【发布时间】: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 幕后发生的事情。

那么有两个问题:

  1. 为什么dVector b = -a; 不编译?

  2. MSVC 编译器做了哪些不同的事情来允许它接受 gcc 拒绝的任何内容?

【问题讨论】:

  • 从未使用过 eigen,但我知道它使用表达式模板,这就是您在此处实际看到的内容,所以我不确定从他们的容器继承是否是个好主意,是吗?

标签: c++ gcc visual-c++ eigen


【解决方案1】:

operator-(dVector) 不存在,但Eigen::VectorXddVector 的公共基础,因此Eigen::operator-(Eigen::VectorXd) 被选为-a

此运算符不返回Eigen::VectorXd,而是一个可转换的包装器类型 到Eigen::VectorXd。此包装器类型不可转换为 dVector,因为需要先将其转换为 Eigen::VectorXd

如果您尝试dVector b = Eigen::VectorXd(-a),它会起作用,出于同样的原因dVector b = dVector(-a) 起作用。

解决方案: 我不建议公开继承 Eigen::VectorXd 使用组合。

解决方案2: 实施operator-(dVector)。现在编译器会选择这个操作符。

解决方案3: 实施operator=(Eigen::VectorXd)Eigen::operator-(Eigen::VectorXd) 的返回类型可以转换为Eigen::VectorXd,因此可以分配给dVector

MSVC 有一个错误或一个语言扩展来进行编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2014-11-23
    • 1970-01-01
    • 2017-11-01
    • 2022-01-23
    相关资源
    最近更新 更多