C ++ const规则?

时间:2010-12-08 06:27:11

标签: c++ operator-overloading const

我正在构建一个矩阵类来加强我对c ++的了解。我的重载==运算符然后不断返回'丢弃限定符'错误,我理解这是违反const规则的某种方式,但我无法弄清楚如何。

template <class T, unsigned int rows, unsigned int cols>
bool Matrix<T,rows,cols>::operator==(const Matrix<T,rows,cols>& second_matrix) const{
    if (_rows != second_matrix.getNumRows() || _cols != second_matrix.getNumCols())
        return false;
    else{
        unsigned int i,j;
        for (i = 0; i < rows; i++){
                for (j = 0; j < cols; j++){
                if (data[i][j] != second_matrix(i,j))
                    return false;
            }
        }
    }

    return true;
}

在'if(data [i] [j]!= second_matrix(i,j))'行上返回错误。所以,为了完整性,这是我的!=运算符:

template <class T, unsigned int rows, unsigned int cols>
bool Matrix<T,rows,cols>::operator!=(const Matrix<T,rows,cols>& second_matrix) const{
    return !(*this == second_matrix);
}

此外,()运算符:

template <class T, unsigned int rows, unsigned int cols>
T & Matrix<T,rows,cols>::operator()(int row, int col){
    return data[row][col];
}

2 个答案:

答案 0 :(得分:3)

这是你的()操作。它不是常量。您不能在const对象上调用非const函数。制作一个const版本的()返回const&amp;或按价值。

答案 1 :(得分:1)

template <class T, unsigned int rows, unsigned int cols>
T & Matrix<T,rows,cols>::operator()(int row, int col){
    return data[row][col];
}

非常。这本身很好,但是对于只读访问,您需要重载此成员函数。然后编译器将自动选择const重载:

template <class T, unsigned int rows, unsigned int cols>
T & Matrix<T,rows,cols>::operator()(int row, int col){
    return data[row][col];
}
template <class T, unsigned int rows, unsigned int cols>
const T & Matrix<T,rows,cols>::operator()(int row, int col) const{
    return data[row][col];
}

(您还必须在类体中声明第二个版本。)