我需要在我的流运算符MatrixSequence::matrix
中使用ostream& operator<<(ostream &outputStream, const MatrixSequence &sequence)
,所以我需要它是const。但是它使用的Map<Matrix>
似乎并不安全。我收到了错误
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;
}
答案 0 :(得分:0)
如果你确定你的函数是const安全的,你可以使用const_cast<target_type>
抛弃constness。
以这种方式修改const值是未定义的行为。
答案 1 :(得分:0)
正如评论中所建议的那样,更清晰的解决方案是返回Map<const MatrixXd>
,如自包含示例中所示:
#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();;
}