我写了一个基于std::vector
的矩阵模板。当我想在两个矩阵之间进行数学运算时,我遇到了一个问题:一个是const
引用,另一个不是const
而不是引用。
我正在通过代理来检索存储在std::vector
:
template<typename T>
class Mat
{
public:
typedef T value_type;
typedef T& reference;
typedef const T& const_reference;
typedef typename std::vector<T>::size_type size_type;
private:
class Proxy
{
public:
Proxy(Mat& o, value_type i) : o(o), i(i)
{}
operator value_type()
{ return o.m[i]; }
reference operator=(const_reference other)
{ return o.m[i] = other; }
reference operator+=(const_reference other)
{ return o.m[i] += other; }
value_type operator*(const_reference other)
{ return o.m[i] * other; }
private:
Mat& o;
size_type i;
};
// Matrix methods and operator overloads.
Proxy operator[](size_type i)
{ return Proxy(*this, i); }
const Proxy operator[](size_type i) const
{ return Proxy(*this, i); }
以下是触发错误的测试类摘录中的示例:
void Test::buildMemoryMatrix(const Mat<int>& state)
{
Mat<int> t = state.getTransposed();
for(Mat<int>::size_type i = 0; i < state.rows(); ++i)
{
for(Mat<int>::size_type j = 0; j < t.cols(); ++j)
{
for(Mat<int>::size_type k = 0; k < state.cols(); ++k)
{
if(i == j)
{ continue; }
memory[i * memory.cols() + j] += state[i * state.cols() + k] * t[k * t.cols() + j];
}
}
}
}
Mat<int>
方法和Test
类成员的一些精确性:memory
是Test
的成员。它表示为Mat<int>
对象; Mat::getTransposed()
返回矩阵的转置; Mat::rows()
返回矩阵的行数; Mat::cols()
返回矩阵的列数以下一行给我带来了一些麻烦:
memory[i * memory.cols() + j] += state[i * state.cols() + k] * t[k * t.cols() + j];
将'const Mat :: Proxy'作为'this'参数传递会丢弃限定符 [-fpermissive]
如何解决这个问题? 谢谢你的回答。