0

2つの行列クラスがあるとしましょう。1つの行列は2x2で、もう1つは3 x 3です。次に、それらを乗算します。もちろん、同じ次元を持たない2つの行列を乗算することはできません。

ランタイムチェックを組み込むことができることは知っていますが、c ++言語を使用してコンパイル時チェックを組み込む方法はありますか?したがって、異なる次元の2つの定義された行列が乗算されるプログラムをコンパイルしようとすると、コンパイル時エラーが発生します。

Matrix *matrix1 = new Matrix(2,2);
Matrix *matrix2 = new Matrix(3,3);

Matrix_Multiply(matrix1,matrix2);  // compiler throws error on this line 

また、このトピックについて話している間、この機能を備えたプログラミング言語はありますか?

4

2 に答える 2

1

答えは、行列がディメンションを取得する方法によって異なります。ディメンションが実行時に決定される場合、コンパイル時のチェックはありません。ただし、行列がコンパイル時のディメンションである場合は、当然、コンパイル時のチェックが行われることになります。

template <typename T, int Width, int Height>
class Matrix;

template <typename T, int M, int N, int O>
Matrix<T, M, O> operator* (Matrix<T, M, N> const& lhs, Matrix<T, N, O> const& rhs);

つまり、結果行列のサイズは、2つの引数行列のサイズによって推定されます。次元が一致しない場合、適切な乗算演算子は見つかりません。

于 2012-12-02T23:13:11.970 に答える
0

テンプレートパラメータとしてディメンションを使用して、テンプレートマトリックスクラスを定義できます。このタイプに対してのみを定義するoperator*()と、コンパイラーはこのタイプと別のタイプの乗算を防ぎます。

template<int rows, int cols> class matrix {
public:
    friend matrix operator*(const matrix &m1, const matrix &m2);
};
于 2012-12-02T23:14:58.723 に答える