2010-12-08 10 views
1

私はC++の知識を強化するために、マトリックスクラスを構築しています。しかし、私のオーバーロードされた==演算子は、何らかの形でconstルールの違反であると理解している「discards qualifiers」エラーを返し続けますが、どのように把握できません。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]; 
} 

答えて

3

それはあなたの()オペアンプですので、ちょうど完全を期すため、ここに私=演算子です。それはconstではありません。 constオブジェクトに対して非const関数を呼び出すことはできません。 const &または値で返すconstバージョンの()を作成します。

+0

ヒント@JakeVA:プロトタイプ 'のconst T&演算子()(int型の行コンパイラが自動的にconstのオーバーロードを選択します、int col)const; '末尾の 'const'は' * this'がconstであることを意味します。 – ephemient

+0

それは、ありがとう – jakev

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]; 
} 

(あなたはまた、クラス本体における第二のバージョンを宣言する必要があります。)