具有实矩阵和复矩阵的矩阵类的C ++运算符重载

时间:2016-04-03 14:26:03

标签: c++

我试图实现一个可以处理实矩阵和复矩阵的矩阵类。当我尝试重载乘法运算符时,我遇到了问题。具体来说,当我尝试将双矩阵乘以复数矩阵(按此顺序)时。结果应该是复杂的,但*运算符是双矩阵的成员,在这种情况下,我不知道如何返回一个复杂的矩阵(我已尝试使用友元运算符,这不是' ;似乎也工作)。这是相关的代码段:

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,表示没有找到全局运算符,它采用类型复杂(或无法接受的转换)。我想避免对真实和复杂类型的模板进行完全专门化,有没有办法解决这个问题?

提前致谢。

1 个答案:

答案 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的元素类型相同。

然后,如果AMatrix<double>并且您将其与Matrix<complex<double> >相乘,则会得到Matrix<double>作为回报 - 这显然是错误的。