2016-04-03 143 views
4

我试图实现一个矩阵类,该类可以处理实矩阵和复矩阵。当我尝试重载乘法运算符时遇到问题。具体来说,当我尝试乘以一个复合矩阵的双重矩阵(按此顺序)。结果应该是复杂的,但*运算符是在这种情况下的双重矩阵的成员,我不明白如何返回一个复杂的矩阵(我试过使用朋友操作符,这似乎并不工作)。下面是相关的代码片段: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; 
} 

因此,如果是真实的,B和C是复杂的,C = B 一个工作正常,但C = A B没有。具体来说,编译器错误会标记“temp + =”行,表示没有找到需要复杂类型的全局运算符(或者没有可接受的转换)。我想避免完全专注于真实和复杂类型的模板,有没有办法解决这个问题?

在此先感谢。

+0

要声明'模板矩阵的operator *(const的矩阵&A,常量矩阵&B)' –

+0

参见[运算符重载(http://stackoverflow.com/questions/4421706/operator-overloading)请。 –

+0

谢谢,但这将不得不宣布为朋友操作员,不是吗?这就产生了一个新问题,即多个操作符匹配操作数。 – DJM123

回答

-1

我想在这个问题: 这个 - >元素(...)

我不知道该怎么做了固定。但我为了改变两个矩阵的地方。 (A < - > B)

+1

对不起,我没有得到你写的东西。你能否更详细地阐述它。您告诉: – surajsn

+0

:C = BA工作正常,但C = AB不起作用。 我说:解决这个问题有两种方法。专业 2.工程 方式2很简单。这种方式告诉我们,以最简单的方式得到答案。你可以通过改变矩阵A和B来得到答案。另一方面,你将C = AB转换为C = BA。 寻找简单的方式获得答案不包装的方式 –

+0

弟弟。 !我请你认真考虑我的话**,但不要亲自。我已经看到你的个人资料,你非常热心地在这里写下答案,这对你很好。但我可以很容易地看到你的答案大部分是**倒票**。我看到你的答案,发现你不能很好地解释他们。这就是为什么我要求你在写答案之前做一些研究,并总是试着重复一遍,总是尽量在写答案的时候给予你最好的答案,因为它不是关于声誉或者徽章。这是关于给你最好的,所以不要认为是理所当然的。 **保持微笑和愉快的编码**。 :) – surajsn

2

正如在评论中提到的那样,在这种情况下,最好使用operator*的非成员超载(与矩阵类一起使用)。

但这并不是它不起作用的原因。这里的问题是

T temp; Matrix<T> c; 

在您的课operator*。此时应更换每个Tstd::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>作为回报 - 这显然是错误的。

+0

太棒了,喜欢这个解决方案,谢谢!它实际上可以与原始的二进制重载*相配合;是否有理由避免这种做法,即朋友超载是否可取? – DJM123

+0

@ DJM123:不客气。关于这个问题,请参阅[这里](http://stackoverflow.com/a/4421729/2412846)。 – davidhigh

+0

@ DJM123:...但我的链接并没有给出使用非成员重载的动机,因此更好看[这里](http://stackoverflow.com/a/4622467/2412846)。 – davidhigh