我有一个Matrix课程。它是一个模板,带有用于静态分配小矩阵的类型,行和列。问题是运算符*和运算符* =的重载。在这种情况下,必须为另一个对象授予操作:相同类型,行等于我的列和多个列。我现在编写了这段代码并且它有效,但我想知道我是否可以强制使用相同的类型T而不是另一种类型T1。行和列也是一样。
template<typename T, int R, int C>
class Matrix {
private:
//some data.....
public:
//some methods.....
template <typename T1, int R1, int C1> <----here I'd like to use T as type
Matrix<T,R,C1> operator*(const Matrix<T,R1,C1>& rhs);
template <typename T1, int R1, int C1>
Matrix<T,R,C1>& operator*=(const Matrix<T,R1,C1>& rhs);
}
答案 0 :(得分:3)
对于operator *
,模板参数不必与函数参数匹配,因此您可以将其保留。此外,还有一个限制,即第二个矩阵的行数与第一个矩阵的列数相匹配,因此您实际上只需要一个模板参数:
template<typename T, int R, int C>
class Matrix {
private:
//some data.....
public:
//some methods.....
template <int C1>
Matrix<T,R,C1> operator*(const Matrix<T,C,C1>& rhs) const;
};
operator *=
只适用于方形矩阵,所以你必须小心。
答案 1 :(得分:1)
template<typename T, int R, int C>
class Matrix {
private:
//some data.....
public:
//some methods.....
template <int C2>
Matrix<T,R,C2> operator*(const Matrix<T,C,C2>& rhs);
Matrix& operator*=(const Matrix<T,C,C>& rhs);
}
您可以使用封闭类中的模板参数,不用担心。
无论如何,我将两个运算符都减少到矩阵乘法实际允许的范围。