矢量代理const和非const操作

时间:2017-11-18 00:32:50

标签: c++11 templates

我写了一个基于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类成员的一些精确性:

  • memoryTest的成员。它表示为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]

如何解决这个问题? 谢谢你的回答。

0 个答案:

没有答案