【发布时间】: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<const Matrix>,它看起来可能会起作用。 -
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