0

とても参考になったので、もう一つ質問です。

テンプレートを使用して行列乗算を実装しましたが、コードをコンパイルできません。

ここにあります。

マトリックス.h:

#ifndef __MATRIX_H__
#define __MATRIX_H__

template <class T, int rows, int cols> class matrix {
public:
    T mat[rows][cols];
    matrix();
    matrix(T _mat[rows][cols]);
    matrix operator+(const matrix& b);
};

template <class T, int rows, int cols> matrix <T,rows,cols> :: matrix (T _mat[rows][cols]){
    for (int i=0; i<rows; i++){
        for (int j=0; j<cols; j++){
            mat[i][j] = _mat[i][j];
        }
    }
}

template <class T, int rows, int cols> matrix <T,rows,cols> :: matrix (){
    for (int i=0; i<rows; i++){
        for (int j=0; j<cols; j++){
            mat[i][j] = 0;
        }
    }
}

template <class T, int rows, int cols> matrix <T,rows,cols> matrix <T,rows,cols>::operator+(const matrix<T, rows, cols>& b){
    matrix<T, rows, cols> tmp;
    for (int i=0; i<rows; i++){
        for (int j=0; j<cols; j++){
            tmp.mat[i][j] = this->mat[i][j] + b.mat[i][j];
        }
    }
    return tmp;
}

template <class T, int rows, int cols> template <int new_cols> matrix <T,rows,new_cols> matrix <T,rows,cols>::operator*(const matrix<T, cols, new_cols>& b){
    matrix<T,rows,new_cols> tmp;
    int i, j, k;
    T sum;
    for(i=0; i<rows; i++){
        for(j=0; j<new_cols; j++){
           sum = 0;
           for (k=0; k<cols; k++){
               sum += this->mat[i][k] * b.mat[k][j];
           }
           tmp.mat[i][j] = sum;
        }
    }
    return tmp;
}



#endif

マトリックス.cpp:

#include "tar5_matrix.h"
int main(){

    int mat1[2][2] = {1,2,
                      3,4};
    int mat2[2][2] = {5,6,
                      7,8};
    int res[2][2];
    matrix<int, 2, 2> C;
    matrix<int, 2, 2> D;
    matrix<int, 2, 2> A = mat1;
    matrix<int, 2, 2> B = mat2;
    C = A+B;
    D = A*B;

    return 0;

}

コンパイルしようとすると、次のエラーが発生します。

1>  tar5_matrix.cpp
1>c:\users\karin\desktop\lior\study\cpp\cpp_project\cpp_project\tar5_matrix.h(68): error C2039: '*' : is not a member of 'matrix<T,rows,cols>'

1>c:\users\karin\desktop\lior\study\cpp\cpp_project\cpp_project\tar5_matrix.cpp(14): error C2676: binary '*' : 'matrix<T,rows,cols>' does not define this operator or a conversion to a type acceptable to the predefined operator

お知らせ下さい。

4

2 に答える 2

5

operator*クラス本体で定義していません。

于 2012-05-19T20:31:53.480 に答える
0

Oli が指摘しているように、問題はoperator*メンバー メソッドとして宣言していないのに、それをそのように定義しようとしていることです。ここにある 2 つの選択肢は、宣言を追加するか、それをフリー関数に変更することです。乗算は右側よりも左側の演算ではないため、私は自由関数アプローチを特に好みます。

template <typename T, size_t N, size_t M, size_t O>
matrix<T,M,O> operator*( matrix<T,M,N> const & lhs, 
                         matrix<T,N,O> const & rhs )
{
   // ...
}
于 2012-05-19T22:17:55.793 に答える