我试图实现一个可以处理实矩阵和复矩阵的矩阵类。当我尝试重载乘法运算符时,我遇到了问题。具体来说,当我尝试将双矩阵乘以复数矩阵(按此顺序)时。结果应该是复杂的,但*运算符是双矩阵的成员,在这种情况下,我不知道如何返回一个复杂的矩阵(我已尝试使用友元运算符,这不是' ;似乎也工作)。这是相关的代码段:
template <class V> Matrix<T> operator *(const Matrix<V> &b)
{
long i, j, k; T temp; Matrix<T> c(mRows, b.Cols());
for (i = 0; i < mRows; i++)
for (j = 0; j < c.Cols(); j++)
{
for (temp = 0, k = 0; k < mCols; k++)
temp += this->Element(i, k)*b.Element(k, j);
c(i, j) = temp;
}
return c;
}
因此,如果A是实数,而B和C是复数,则C = B A工作正常,但C = A B不能。具体来说,编译器错误标记&#34; temp + =&#34; line,表示没有找到全局运算符,它采用类型复杂(或无法接受的转换)。我想避免对真实和复杂类型的模板进行完全专门化,有没有办法解决这个问题?
提前致谢。
答案 0 :(得分:3)
正如评论中所提到的,在这种情况下,最好使用operator*
的非成员重载(对于矩阵类是 - friend
。)
但这并不是它不起作用的原因。这里的问题是
的声明T temp; Matrix<T> c;
在课堂上operator*
。您应该将每个T
替换为std::common_type_t<T,U>
:
using C = std::common_type_t<T,U>;
C temp; Matrix<C> c;
否则返回矩阵的元素类型将始终与调用矩阵的元素类型相同。也就是说,当您致电C = A*B
并将其解析为C = A.operator*(B)
时,C
的元素类型将与A
的元素类型相同。
然后,如果A
是Matrix<double>
并且您将其与Matrix<complex<double> >
相乘,则会得到Matrix<double>
作为回报 - 这显然是错误的。