我不知道如何命名我所面临的问题。所以我有一个矩阵的模板类来接受不同的类型,例如int,double和其他东西。我的问题是如果我想要处理类的不同实例类型,我无法编译它。这是add函数的定义,据说应该在当前实例中添加一个矩阵。
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>&)
可以采用哪种解决方法?
答案 0 :(得分:4)
在类模板中,模板名称是当前实例化的快捷方式。也就是说,Matrix
与Matrix<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) {
// ...
}