我自己开发了一个基于表达式模板的 C++ 矩阵类。我还实现了一个Range
类来启用类似 Matlab 的读取
cout << A(Range(3,5),Range(0,10)) << endl;
我现在想启用类似 Matlab 的作业
A(Range(3,5),Range(0,10))=B;
其中B
是一个合适的矩阵。
运算Matrix
()
符重载如下
inline Expr<SubMatrixExpr<const OutType*,OutType>,OutType> operator()(Range range1, Range range2)
{ typedef SubMatrixExpr<const OutType*,OutType> SExpr;
return Expr<SExpr,OutType>(SExpr(...some stuff...),...some stuff...);
}
该类SubMatrixExpr
示例为
template <class A, class Type>
class SubMatrixExpr
{
// Constructor (M is a pointer to the Matrix data)
SubMatrixExpr(const A &M, ...stuff...) : ...stuff...
// Access operator
inline Type operator[](const int i) const { ...stuff... }
}
而Expr
类的例子如下:
template <class A, class B>
class Expr
{
// Constructor (a is the expression, the SubMatrixExpr in my case)
Expr(const A &a, ...stuff...) : ...stuff...
// Access
inline B operator[](const int i) const { return a_[i]; }
Expr<A,B> operator=(const Matrix<B> &ob)
{
for (int i=0; i<GetNumElements(); i++) { std::cout << a_[i] << " " << ob.GetDataPointer()[i] << "\n"; a_[i] = ob.GetDataPointer()[i]; }
return *this;
}
}
我的问题如下。我const
在上面的两个表达式类的访问运算符中使用。结果是类的重载=
运算符Expr
正确返回a_[i]
and ob.GetDataPointer()[i]
,但它没有进行赋值。
是否可以在不更改整个代码的情况下忽略const
重载运算符中的 -ness ?=
非常感谢您的帮助。
按照 Lol4t0 的回答进行编辑
我已经删除了该Expr
课程的原始访问运算符并添加了
inline const B& operator[](const int i) const { return a_[i]; }
inline B& operator[](const int i)
{
const Expr& constThis = *this;
return const_cast<B&>(constThis[i]);
}
另外,我已经删除了我原来的访问运算符SubMatrixExpr
并添加了
inline const Type& operator[](const int i) const
{
// Stuff
return M_[IDX2R(GlobalRow,GlobalColumn,Columns_up_)];
}
和
inline Type& operator[](const int i)
{
// Stuff
// The following line returns an error
return M_[IDX2R(GlobalRow,GlobalColumn,Columns_up_)];
}
不幸的是,编译器返回以下错误
qualifiers dropped in binding reference of type "LibraryNameSpace::double2_ &" to initializer of type "const LibraryNameSpace::double2_"
(double2_
是我自己的复杂类型)。
编辑#2 - 关于 M_ 的信息
template <class A, class Type>
class SubMatrixExpr
{
private:
A M_;
// STUFF
}
从Matrix ()
上面报告的运算符重载中,对于我当前正在运行的示例,矩阵类型A = const OutType*
在哪里。OutType
double2_