4

したがって、次の演算子のオーバーロードを持つ、作成した汎用 Matrix クラスがあります。

class Matrix
{
public:
    Matrix() {}
    Matrix(int i, int j, int k) {}
    Matrix operator*(const Matrix &right)
    {
    }
};

Matrix クラスから継承する Matrix2 クラスもあります。

class Matrix2 : public Matrix
{
};

2 つの Matrix2 オブジェクトを乗算しようとすると、次のようなコンパイラ エラーが発生します。

「Matrix2 型の左側のオペランドを取る演算子が見つかりません (またはアクセス可能な変換がありません)」

これはなぜですか? また、継承を使用して演算子のオーバーロードを適切に実装するにはどうすればよいですか?

編集:

指摘したように、私の問題は部分的に「最も厄介な解析」が原因でした。今、私の問題は、演算子のオーバーロードと継承に厳密に関係していると思います。

2 つの Matrix オブジェクトを正常に乗算できますが、2 つの Matrix2 オブジェクトを乗算することはできません。

Matrix2 i;
Matrix2 m;
Matrix result = m * i;

エラーメッセージ:

error C2678: binary '*' : no operator found which takes a left-hand operand of type 'Matrix2' (or there is no acceptable conversion).

4

3 に答える 3

3

あなたは最も厄介なパースを噛んでいます。これは、オブジェクトではなく関数の宣言につながる構文エラーです。

于 2012-08-08T20:50:40.510 に答える
2

演算子のオーバーロードに関するこの記事を確認してください。非常によく説明されています。

Matrix@silvesthu が説明しているように、乗算演算子を 2 つの引数を取り、新しいオブジェクトを返す静的関数として実装する方がよい場合があります。演算子を使用するなど、何らかの方法でクラスを変更する必要がある場合*=は、静的関数の観点からこれを実装できます。

アップデート

次のコードをコンパイルするとうまくいきます。

class Matrix
{
public:
    Matrix() {}
    Matrix(int i, int j, int k) {}
    Matrix operator*(const Matrix &right)
    {
        return Matrix();
    }
};

class Matrix2 : public Matrix
{
};


int _tmain(int argc, _TCHAR* argv[])
{
    Matrix2 a, b;
    Matrix c = a * b;
    return 0;
}

2 つの Matrix2 オブジェクトを実際に乗算できることを示しています。なぜ問題が発生するのかまったくわかりません。

于 2012-08-08T20:56:36.920 に答える
2

問題はオーバーロードされた演算子ではなく、定義した変数にあります。おそらくm1andm2は型Matrixだと思っているでしょうが、実際には関数が返すものですMatrix(パラメーターなし)。宣言内の括弧を削除して、見た目が良くなるかどうかを確認してください。

これは、@DeadMG が回答で参照している最も厄介な解析です。

于 2012-08-08T20:53:19.213 に答える