Ich versuche, eine Matrixklasse zu implementieren, die sowohl echte als auch komplexe Matrizen verarbeiten kann. Ich habe Probleme, wenn ich versuche, den Multiplikationsoperator zu überladen. Genauer gesagt, wenn ich versuche, eine doppelte Matrix mit einer komplexen Matrix zu multiplizieren (in dieser Reihenfolge). Das Ergebnis sollte komplex sein, aber der Operator * ist ein Mitglied einer Doppelmatrix. In diesem Fall sehe ich nicht, wie man eine komplexe Matrix zurückgibt (ich habe versucht, einen Freundoperator zu verwenden, das scheint auch nicht zu funktionieren). Hier ist der relevante Code-Schnipsel:C++ Operatorüberladung für eine Matrixklasse mit reellen und komplexen Matrizen
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;
}
Also, wenn A real ist, und B und C sind komplex, C = B A funktioniert gut, aber C = A B nicht. Insbesondere weist der Compilerfehler die Zeile "temp + =" darauf hin, dass kein globaler Operator gefunden wurde, der den Typ komplex (oder keine akzeptable Konvertierung) akzeptiert. Ich möchte vermeiden, die Vorlage für reale und komplexe Typen vollständig zu spezialisieren, gibt es einen Weg um dies zu umgehen?
Vielen Dank im Voraus.
Sie wollen 'template Matrix operator * (const Matrix & a, const Matrix & b)' –
Siehe auch [Operator Overloading] (http://stackoverflow.com/questions/4421706/operator-overloading) zu erklären, Bitte. –
Danke, aber das müsste als Freund-Operator deklariert werden, oder? Und dies erzeugt ein neues Problem, nämlich dass mehr als ein Operator den Operanden entspricht. – DJM123