返回矢量成员引用

时间:2016-10-11 12:50:12

标签: c++ templates c++11

我在c ++中实现了一个模板Matrix类,我面临运算符()重载的错误。这是代码:

Matrix.hpp:

template <typename T>
class Matrix {
    std::vector<T>* _data;
    int _sx;
    int _sy;

public:
    // CTOR - DTOR

    Matrix(int sx, int sy);
    Matrix(Matrix<T> const &other);
    ~Matrix();

    // Operator Overloads

    Matrix<T>& operator+=(Matrix<T> const &other);
    Matrix<T>& operator-=(Matrix<T> const &other);
    Matrix<T>& operator*=(Matrix<T> const &other);
    Matrix<T>& operator/=(Matrix<T> const &other);
    Matrix<T>& operator=(Matrix<T> const &other);
    T& operator()(int x, int y);


    // Member Functions
    void display() const;
    int getSx() const;
    int getSy() const;

private: // Private Member functions

    bool _rangeCheck(int x, int y) const;
};

#include "../srcs/Matrix.inl"

Matrix.inl(问题部分)

template <class T>
T& Matrix<T>::operator()(int x, int y) {
    if (this->_rangeCheck(x, y)) {
        return (this->_data[(y * this->_sx) + x]);
    }

    throw std::out_of_range("Bad argument");
}

编译时我在执行myMatrix(1, 0) = 1时收到此错误:

./include/../srcs/Matrix.inl:65:9: error: non-const lvalue reference to type 'int' cannot bind to a value of unrelated type 'std::vector<int>'
    return (this->_data[(y * this->_sx) + x]);

知道我做错了什么?

1 个答案:

答案 0 :(得分:3)

(this->_data[(y * this->_sx) + x]);

您的data是指针,因此在operator[]上使用data作为std::vector<T>数组访问(*(this->_data)[(y * this->_sx) + x]); 。替换为:

std::vector

您可以考虑在此处避开指针,或继承template <typename T> class Matrix { std::vector<T> _data; //... }; template <typename T> class Matrix : private std::vector<T> { //... };

{{1}}

修改

正如molbdnilo的评论所指出的那样,不推荐继承标准容器。

请参阅this question了解原因。