2016-06-26 6 views
0

私が直面している問題の名前をどのようにするかわかりません。だから私は行列のためのテンプレートクラスを持っています。 int、double、その他のもの。私の問題は、私がクラスの異なるインスタンスの型に取り組んで、コンパイルすることができない場合です。ここには、現在のインスタンスに行列を追加するはずのadd関数の定義があります。2種類のテンプレートを同じにする

template <class T> 
void Matrix<T>::add(const Matrix &m) { 
    for (int i = 0; i < this->rows; ++i) { 
     for (int j = 0; j < this->cols; ++j) { 
      this->mat[i][j] += m.at(i,j); 
     } 
    } 
} 

Matrix<double>Matrix<double>インスタンスに追加すると

しかし、私はMatrix<int>Matrix<double>例えばに追加し、それを動作させることはできません。

Matrix<double> matA(2,2); 
Matrix<int> matB(2,2); 
matA.add(matB); 

コンパイラ(G ++ 4.8は)文句:

error: no matching function for call to ‘Matrix<double>::add(Matrix<int>&) 

何この問題を回避することができますか?

答えて

4

クラステンプレート内では、テンプレート名は現在のインスタンス化のショートカットです。つまり、MatrixMatrix<T>と同じです。したがって、void add(const Matrix& m);を宣言することによって、同じタイプの別のマトリックスを追加できると言います。

任意のタイプの別の行列を追加するには、別のテンプレートパラメータを導入する必要があります。

template <class T> 
class Matrix { 
    // ... 
public: 
    template <class U> 
    void add(const Matrix<U>& m); 
}; 

template <class T> template <class U> 
void Matrix<T>::add(const Matrix<U>& m) { 
    // ... 
} 
関連する問題