【问题标题】:Using safe non-const function in a const function在 const 函数中使用安全的非常量函数
【发布时间】:2013-12-12 16:01:34
【问题描述】:

我需要在我的流运算符ostream& operator<<(ostream &outputStream, const MatrixSequence &sequence) 中使用MatrixSequence::matrix,所以我需要它是const。但是它使用Map<Matrix>,这似乎不是 const 安全的。我得到了错误

matrixsequence.cpp:38: error: invalid conversion from 'const double*' to 'Eigen::Map<Eigen::Matrix<double, -1, -1> >::PointerArgType {aka double*}' [-fpermissive]

当我将最终的 const keywrk 添加到 MatrixSequence::Matrix

typedef Eigen::MatrixXd Matrix;
typedef Eigen::Map Map;

Map<Matrix> MatrixSequence::matrix(const unsigned int i) const {
    assert(i <= shapes_->size());
    const double* beginning = &data_.at(beginning_matrix->at(i));
    const tuple<int, int>& shape = shapes_->at(i);
    return Map<Matrix>(beginning, get<0>(shape), get<1>(shape));
}

ostream& operator<<(ostream &outputStream,
                    const MatrixSequence &sequence) {
    for(unsigned int i=0; i<sequence.size(); i++) {
        outputStream << "\n" << sequence.matrix(i) << "\n";
    }
    return outputStream;
}

【问题讨论】:

  • 我对 Eigen 不熟悉,但是如果您将返回类型更改为 Map&lt;const Matrix&gt;,它看起来可能会起作用。
  • Eigen::Map 不起作用。我在代码的不相关部分收到错误。我认为这是因为他们在 Map. 中有很多模板元编程
  • 真可惜。如果 Map 真的不是 const 正确的,那么您可能也无法使您的代码 const 正确;你只需要放弃你的const,或者使用const_cast并希望最好。
  • Eigen::Map 应该真的有效。您使用的是哪个 Eigen 版本?
  • 我用的是3.2.0版本。最小代码在这里gist.github.com/MatthieuBizien/7936480 我认为这是因为 Map(beginning, ...) 的开头必须是非恒定的。

标签: c++ eigen const-correctness


【解决方案1】:

如 cmets 中所建议,更简洁的解决方案是返回 Map&lt;const MatrixXd&gt;,如独立示例中所示:

#include <Eigen/Core>
using namespace Eigen;

struct Foo {
  double data[10];

  Eigen::Map<const MatrixXd> foo() const {
    Map<const MatrixXd> out(data, 5, 2);
    return out;
  }
};

int main() {
  Foo f;
  MatrixXd A = 2 * f.foo();;
}

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    相关资源
    最近更新 更多