我有这样定义的矩阵类:
template<int M, int N, typename T>
class Matrix
{
typedef Matrix<M, N, T> MTYPE;
/*...*/
};
我必须实现矩阵乘法,但我不知道如何进行运算符覆盖..
像
这样的东西MTYPE operator *(MTYPE& m) { /*...*/ }
只接受N * M矩阵。那我怎么能克服这个问题呢?
答案 0 :(得分:3)
您需要在类的内部或外部创建模板化运算符。
例如,要将N x M乘以M x M,您可能需要这样做:
template <int N, int M, class T>
friend Matrix<N, M, T> operator*(const Matrix<N, M, T> &lhs, const Matrix<M, M, T> &rhs);
其他版本看起来很相似。在课堂外定义它可能是最有用的。
要将(N1 x M)乘以(M x N2),您需要:
template<int N1, int N2, int M, class T>
friend Matrix<N1, N2, T> operator*(const Matrix<N1, M, T> &lhs, const Matrix<M, N2, T> &rhs);
答案 1 :(得分:3)
正如评论中指出的那样,* =对非方形矩阵没有意义。
对于一般情况,
template<int M, int N, typename T>
class Matrix
{
typedef Matrix<M, N, T> MTYPE;
/*...*/
public:
template<int L>
Matrix<M,L,T> operator*(const Matrix<N,L,T>& second) const
{
Matrix<M,L,T> result;
for(...)
for(...)
for(...)
// ...
return result;
}
};
或者,如果您愿意,可以使用带有两个参数的自由函数运算符*(以及模板参数M,N,L和T),并使其成为矩阵类的朋友。