Get the error message "class complex has no suitable copy constructor"

17 May 2012

Hi Fellows, I have a small problem with my copy constructor definition in the class complex, which I have directly copied from cplusplus.com into my project. I want to define complex datatypes in order to implement FFT for some lessons in our technical highschool. The expression Zahl1 = Zahl2 (both are of type complex) produces no error, but Zahl1 = Zahl2 + Zahl3 (all are of type complex) produces the compiler error "class complex has no suitable copy constructor". What could be wrong? I would be glad if somebody can give me a hint.

Best regards Roland

Here is the complete code:

--- begin ---------

  1. include "mbed.h"
  2. include <stdint.h>

------ Definition der Klasse Complex um Komplexe Zahlen fuer diverse Aufgaben, wie z.B. FFT, verarbeiten zu koennen

class complex { private: float real; Real Part float imag; Imaginary Part

public: complex(float,float); complex(complex&); complex operator +(complex); complex operator -(complex); complex operator *(complex); complex operator /(complex); complex getkonjugierte(); complex getreziprok(); float getbetrag(); void setdata(float,float); void setreal(float); void setimag(float); float getreal(); float getimag(); bool operator ==(complex); void operator =(complex); };

CONSTRUCTOR complex::complex(float r=0.0f,float im=0.0f) { real=r; imag=im; }

COPY CONSTRUCTOR complex::complex(complex& c) { this->real=c.real; this->imag=c.imag; }

Ueberladen des Operators = fuer komplexe Zahlen void complex::operator =(complex c) { this->real=c.real; this->imag=c.imag; }

Ueberladen des Operators + fuer komplexe Zahlen complex complex::operator +(complex c) { complex tmp; tmp.real=this->real+c.real; tmp.imag=this->imag+c.imag; return tmp; }

Ueberladen des Operators - fuer komplexe Zahlen complex complex::operator -(complex c) { complex tmp; tmp.real=this->real - c.real; tmp.imag=this->imag - c.imag; return tmp; }

Ueberladen des Operators * fuer komplexe Zahlen complex complex::operator *(complex c) { complex tmp; tmp.real=(real*c.real)-(imag*c.imag); tmp.imag=(real*c.imag)+(imag*c.real); return tmp; }

Ueberladen des Operators / fuer komplexe Zahlen complex complex::operator /(complex c) { float div=(c.real*c.real) + (c.imag*c.imag); complex tmp; tmp.real=(real*c.real)+(imag*c.imag); tmp.real/=div; tmp.imag=(imag*c.real)-(real*c.imag); tmp.imag/=div; return tmp; }

Berechne die Konjugierte der komplexen Zahl complex complex::getkonjugierte() { complex tmp; tmp.real=this->real; tmp.imag=this->imag * -1; return tmp; }

Berechne den reziproken Wert der komplexen Zahl (1/X) complex complex::getreziprok() { complex t; t.real=real; t.imag=imag * -1; float div; div=(real*real)+(imag*imag); t.real/=div; t.imag/=div; return t; }

Berechne den Betrag der komplexen Zahl sqrt(real^2+imag^2) float complex::getbetrag() { float z; z=(real*real)+(imag*imag); z=sqrt(z); return z; }

Setzen der komplexen Zahl void complex::setdata(float r,float i) { real=r; imag=i; }

Setzen des Realwertes der komplexen Zahl void complex::setreal(float r) { real=r; }

Setzen des Imaginaerwertes der komplexen Zahl void complex::setimag(float i) { imag=i; }

Abfragen des Realanteils der komplexen Zahl float complex::getreal() { return real; }

Abfragen des Imaginaeranteils der komplexen Zahl float complex::getimag() { return imag; }

Ueberladen des Operators == bei logischen Vergleichsabfragen bool complex::operator ==(complex c) { return (real==c.real)&&(imag==c.imag) ? 1 : 0; }

Ende der Klasse complex --------

BusOut myled(LED1, LED2, LED3, LED4);

complex Zahl1(2.0f, 1.0f); complex Zahl2(3.0f, 2.0f); complex Zahl3(4.0f, 3.0f);

int main() { while(1) { Zahl3 = Zahl1 + Zahl1;

myled = Zahl3.getreal(); wait(2.0); myled = Zahl3.getimag(); wait(2.0); } }

----end ---------

17 May 2012

Hi, the code isn´t realy readable. Here is it once more:

----Code-------

  1. include "mbed.h"
  2. include <stdint.h>

------ Definition der Klasse Complex um Komplexe Zahlen fuer diverse Aufgaben, wie z.B. FFT, verarbeiten zu koennen

class complex { private: float real; Real Part float imag; Imaginary Part

public: complex(float,float); complex(complex&); complex operator +(complex); complex operator -(complex); complex operator *(complex); complex operator /(complex); complex getkonjugierte(); complex getreziprok(); float getbetrag(); void setdata(float,float); void setreal(float); void setimag(float); float getreal(); float getimag(); bool operator ==(complex); void operator =(complex); };

CONSTRUCTOR complex::complex(float r=0.0f,float im=0.0f) { real=r; imag=im; }

COPY CONSTRUCTOR complex::complex(complex& c) { this->real=c.real; this->imag=c.imag; }

Ueberladen des Operators = fuer komplexe Zahlen void complex::operator =(complex c) { this->real=c.real; this->imag=c.imag; }

Ueberladen des Operators + fuer komplexe Zahlen complex complex::operator +(complex c) { complex tmp; tmp.real=this->real+c.real; tmp.imag=this->imag+c.imag; return tmp; }

Ueberladen des Operators - fuer komplexe Zahlen complex complex::operator -(complex c) { complex tmp; tmp.real=this->real - c.real; tmp.imag=this->imag - c.imag; return tmp; }

Ueberladen des Operators * fuer komplexe Zahlen complex complex::operator *(complex c) { complex tmp; tmp.real=(real*c.real)-(imag*c.imag); tmp.imag=(real*c.imag)+(imag*c.real); return tmp; }

Ueberladen des Operators / fuer komplexe Zahlen complex complex::operator /(complex c) { float div=(c.real*c.real) + (c.imag*c.imag); complex tmp; tmp.real=(real*c.real)+(imag*c.imag); tmp.real/=div; tmp.imag=(imag*c.real)-(real*c.imag); tmp.imag/=div; return tmp; }

Berechne die Konjugierte der komplexen Zahl complex complex::getkonjugierte() { complex tmp; tmp.real=this->real; tmp.imag=this->imag * -1; return tmp; }

Berechne den reziproken Wert der komplexen Zahl (1/X) complex complex::getreziprok() { complex t; t.real=real; t.imag=imag * -1; float div; div=(real*real)+(imag*imag); t.real/=div; t.imag/=div; return t; }

Berechne den Betrag der komplexen Zahl sqrt(real^2+imag^2) float complex::getbetrag() { float z; z=(real*real)+(imag*imag); z=sqrt(z); return z; }

Setzen der komplexen Zahl void complex::setdata(float r,float i) { real=r; imag=i; }

Setzen des Realwertes der komplexen Zahl void complex::setreal(float r) { real=r; }

Setzen des Imaginaerwertes der komplexen Zahl void complex::setimag(float i) { imag=i; }

Abfragen des Realanteils der komplexen Zahl float complex::getreal() { return real; }

Abfragen des Imaginaeranteils der komplexen Zahl float complex::getimag() { return imag; }

Ueberladen des Operators == bei logischen Vergleichsabfragen bool complex::operator ==(complex c) { return (real==c.real)&&(imag==c.imag) ? 1 : 0; }

Ende der Klasse complex --------

BusOut myled(LED1, LED2, LED3, LED4);

complex Zahl1(2.0f, 1.0f); complex Zahl2(3.0f, 2.0f); complex Zahl3(4.0f, 3.0f);

int main() { while(1) { Zahl3 = Zahl1 + Zahl1;

myled = Zahl3.getreal(); wait(2.0); myled = Zahl3.getimag(); wait(2.0); } }