ambiguos overload error bei operatorüberladung...brauche hilfe
-
hallo,
wir sitzen grad an einem matrizenprojekt in dem wir mit operatorüberladung arbeiten sollen.wir haben den * operator für matrizenoperation überladen,das ging eigentlich auch immer bis wir templates für die typenunabhängigkeit eingebunden haben nun bekomme ich immer folgenden fehlerambiguous overload for 'operator*' in 'm1 * m2'
hier mal unser quelltext
header#include <iostream> #include <vector> using namespace std; template<class T> class P_matrix; // Vorwärtsdeklaration der Klasse - vorherige Bekanntmachung der Klasse damit die friend Funktionen diese kennen template<class T> ostream & operator << (ostream & os, const P_matrix<T> &m); // Bekanntmachung das es die Operatoren als Template gibt, um diese in der Klasse als friend erklären zu können template<class T> P_matrix<T> operator * (const P_matrix<T> &MATRIX_A, const P_matrix<T> &MATRIX_B); template<class T> P_matrix<T> operator + (const P_matrix<T> &MATRIX_A, const P_matrix<T> &MATRIX_B); struct newline{}; template <class T> // dies ist eine Template-Klasse class P_matrix { private: vector<vector<T> > mv; // Matrixvektor vector<T> l_vektor; // Lösungsvektor (hiermit wird die Matrix für Gauss zusammengebaut - Lösung in der letzten Spalte der Matrix) vector<T> erg_vec; // Ergebnisvektor für die Rückauflösung (Ergebnis nach Anwendung des Gauss-Algorithmus auf die Matrix) int index; // Durchläuft die Matrix bei der Eingabe T Determinante; // Hier wird der Wert der Determinante gespeichert public: P_matrix(void); // erstellt den ersten Zeilenvektor der Matrix und initialisiert die Variable index für die Eingabe //P_matrix(int n, int m); //~matrix(void); void set_determinante(); // Errechnet die Determinante einer nxn Matrix T get_determinante(); void Zeilenumformung(); // Bilden der Dreiecksmatrix (Nullen erstellen) void Rueckaufloesung(); // Errechnen der Ergebnisse und füllen des Ergebnisvektors void Vertausche(int z1, int z2); // Vertauschen zweier übergebenen Zeilen in der Matrix void Ergebnisausgabe(); // Ausgabe des Ergebnisvektors void pivot(int zeile,int spalte); // ermittelt das Pivotelement (rekursiv) P_matrix& operator >> (const T WERT); // Anhängen eines Wertes an die Matrix P_matrix& operator >> (const struct newline N); // Erstellt einen neuen Zeilenvektor für die Matrix P_matrix& operator += (const P_matrix &MATRIX); // Addiert eine Matrix auf eine andere P_matrix& operator *= (const P_matrix &MATRIX); // Multipliziert eine Matrix auf eine andere friend ostream & operator << <>(ostream & os, const P_matrix<T> &m); // Ausgabe einer Matrix über den ostream Operator friend P_matrix<T> operator * <>(const P_matrix<T> &MATRIX_A, const P_matrix<T> &MATRIX_B); // Multiplikation zweier Matritzen in eine Ergebnismatrix friend P_matrix operator + <>(const P_matrix &MATRIX_A, const P_matrix &MATRIX_B); // Addition zweier Matrizen in eine Ergebnismatrix };cpp(nur die überladung des * operators)
... //// Multiplikation zweier Matrizen in eine Ergebnismatrix ///////////////////// template<class T> P_matrix<T> & operator * (const P_matrix<T> &MATRIX_A, const P_matrix<T> &MATRIX_B) { double hilf=0; //Index-Variablen um durch die Matrix zu laufen P_matrix<T> m_tmp; newline nz; for (int k=0; k<MATRIX_A.mv.size()-1;k++) { for (int i=0; i<MATRIX_B.mv[1].size();i++) //Zeilenvorschub { for (int j=0; j<MATRIX_A.mv[k].size();j++) //Spaltenvorschub { hilf+=MATRIX_A.mv[k][j]*MATRIX_B.mv[j][i]; } m_tmp >> hilf; hilf=0; } m_tmp >> nz; } return m_tmp; ... }und wie ichs in der main aufrufe
_matrix<double> m1,m2,m3; cout<<"Matrizenmuliplikation:"<<endl; int help=1; fflush(stdin); // Tastaturbuffer leeren cout<<"Bitte geben Sie eine Matrix ein"<<endl; cout<<"Sie können die Werte pro Zeile direkt nacheinander durch Leerzeichen oder Tab getrennt eingeben"<<endl; cout<<"Wenn Sie fertig mit der eingabe sind drücken Sie einfach Enter ohne neue Werte einzugeben"<<endl; cout<<endl; while(help != 0) { string line; getline(cin, line); stringstream sstr; sstr << line; double wert; vector<int> v; while (sstr >> wert) { //cout<<"string:"<<wert<<endl; v.push_back(wert); } for(int z=0;z<v.size();z++) { m1>>v[z]; } m1>>nz; help=v.size(); } cout<<"Bitte geben Sie die zweite Matrix ein"<<endl; help=1; while(help != 0) { string line; getline(cin, line); stringstream sstr; sstr << line; double wert; vector<int> v; while (sstr >> wert) { v.push_back(wert); } for(int z=0;z<v.size();z++) { m2>>v[z]; } m2>>nz; help=v.size(); } m3=m1*m2; cout<<m3;weiß wer wovon der fehler kommt und wie man ihn wegbekommt?
mfg
-
In der Vorwärtsdeklaration des Operators operator* gebt ihr ein Matrix<T> Objekt zurück. Bei der Implementierung steht dann aber eine Referenz Matrix<T>&. Deshalb die Fehlermeldung wegen des mehrdeutigen Typs des Operators.
Gruß, smasher
-
danke nun gehts wieder

mfg