Überladen von Operator schlägt fehl
-
Ich habe folgende Klasse (ist nur der relevante Ausschnitt) für komplexe Zahlen:
class CComplex
{
public:
inline CComplex() { re=im=0.0; }
inline CComplex operator*(CComplex c) { return CComplex(re*c.re-im*c.im,re*c.im+im*c.re);}
inline CComplex operator*(double &d) { return CComplex(re*d,im*d);}
double re,im;
};Wenn ich jedoch komplexe Zahlen mit double Zahlen multipliziere, siehe Beispiel:
double m_Phase[8192][8192]; // Phase of Field
double m_Amplitude[8192][8192]; // Amplitude of Field
CComplex m_Field[8192][8192]; // Full electric FieldCComplex Expi(double wt) {return CComplex(cos(wt),sin(wt));}
CComplex Expi(CComplex x) {returnm_Field[x][y]= (m_Amplitude[x][y]) * (Expi(m_Phase[x][y]));
dann bekomme ich den folgenden Fehler:
error C2677: Binärer Operator '*': Es konnte kein globaler Operator gefunden werden, der den Typ 'CComplex' akzeptiert (oder keine geeignete Konvertierung möglich)
Was mache ich falsch ?
Matthias
-
Wenn du den Operator als Member überlädst, greifen implizite Typumwandlungen nicht für den linken Operanden (das heißt, der kann nur für die Multiplikation CComplex*double verwendet werden). Als Lösung kannst du den Operator global überladen:
CComplex operator*(const CComplex& l,const CComplex& r) {return CComplex(l.re*r.re-l.im*r.im,l.re*r.im+l.im*r.re);}
(außerdem benötigst du eventuell noch einen Ctor, der double nach CComplex konvertieren kann)
PS: In der Klassendefinition angelegte Member sind übrigens automatisch 'inline'
PPS: Ehe du dir die Arbeit unnötig schwer machst - es gibt auch eine Klasse std::complex<> in der Standard-Bibliothek.