1

演算子のオーバーロードについて問題があります。私はどこでも見ましたが、このエラーの適切な解決策を見つけることができませんでした. ここに私のコードの一部があります:

Matrix<type> Matrix<type>::operator/(const Matrix& denom){

if(num_of_rows != denom.num_of_rows || num_of_cols != denom.num_of_cols)
    throw string("Unable to divide (Different size).");
if(denom.contains(0))
    throw string("Unable to divide (Divide by zero).");

for(int i = 0; i < num_of_rows; i++)
    for(int j = 0; j < num_of_cols; j++)
        values[i][j] /= denom.values[i][j]; 
                    // I KNOW THIS IS NOT HOW TO DIVIDE TWO MATRICES

return *this;
 }

 void Matrix<type>::operator=(const Matrix& m) const {

delete [][] values;
num_of_rows = m.num_of_rows;
num_of_cols = m.num_of_cols;
values = new type*[num_of_rows];

for(int i = 0; i < num_of_rows; i++){
    *(values + i) = new type[num_of_cols];
    for(int j = 0; j < num_of_cols; j++)
        values[i][j] = m.values[i][j];
}
 }

これは Matrix クラスで、コンストラクターは 2 つの引数を取ります。

class Matrix{

private:
    type** values;
    int num_of_rows, num_of_cols;

public:
    Matrix(){}
    Matrix(int, int);
    type getElement(int, int);
    void print();
    bool contains(type);
    Matrix<type> operator/(const Matrix&);
    void operator=(const Matrix&) const;
};

template <class type>

Matrix<type>::Matrix(int rows, int cols){

values = new type*[rows];
num_of_rows = rows;
num_of_cols = cols;

for(int i = 0; i < rows; i++){
    *(values + i) = new type[cols];
    for(int j = 0; j < cols; j++){
            type random = (type)rand() / 3276.71;
        values[i][j] = random;
    }
}
}

そして、メインのこのコードはこのエラーを出します:

srand(time(NULL));
Matrix<int> m1(3,5);  // creating some objects 
Matrix<double> m2(3,5);  // matrices’ elements are assigned randomly from 0 to 10
Matrix<double> m3(5,5);
Matrix<double> m4(5,6);
if(!(m2.contains(0))){
    Matrix<double> m8(3,5);
    m8=m1/m2; // THIS LINE GIVES ERROR
    m8.print();
}
4

2 に答える 2

4

m1typeMatrix<int>を持っているので、 の適切なオーバーロードoperator/を探すと、次のようになります。

Matrix<int> Matrix<int>::operator/(const Matrix& denom);

ここでのパラメーターの型Matrixは、いわゆる注入されたクラス名を使用することに注意してください。つまり、問題の (テンプレート) クラスであるMatrixため、この場合は を表します。Matrix<int>ただしm2、 への呼び出しの引数のoperator/型はMatrix<double>です。Matrix<double>からへの適切な変換がないMatrix<int>ため、呼び出しは無効です。

operator/可能な修正は、テンプレートにもなるように変更することです。

// Declared inside Matrix<type>:
template<typename Other>
Matrix& operator/=(Matrix<Other> const& other);

(また、オペレーターが実際に行っていることをよりよく反映するように、オペレーターを自由に修正しました。)

ただし、 a Matrix<int>( への呼び出しの結果) を使用して typeoperator/を割り当てるという問題に遭遇します。したがって、おそらく変換を行う必要があります(その場合、変換コンストラクターもお勧めします。または、変換なしの変換コンストラクターのみをお勧めします)。m8Matrix<double>operator=operator=

于 2012-05-13T07:01:38.070 に答える
0

エラーメッセージは、渡す引数として2つのタイプをとる除算演算子を定義していないことを非常に明確に示しています。コードの抜粋を見ると、これが当てはまります。2つを取っている演算子がありますが、 aとaMatrix<T>を取っている演算子はありません(異なるタイプと)。Matrix<T1>Matrix<T2>T1T2

ところで、あなたの質問は何ですか?

于 2012-05-13T07:06:29.803 に答える