Ü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 Field

    CComplex Expi(double wt) {return CComplex(cos(wt),sin(wt));}
    CComplex Expi(CComplex x) {return

    m_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.


Log in to reply