namespace std { template<> class complex<float> { public: typedef float value_type; constexpr complex(float re = 0.0f, float im = 0.0f); explicit constexpr complex(const complex<double>&); explicit constexpr complex(const complex<long double>&); constexpr float real(); void real(float); constexpr float imag(); void imag(float); complex<float>& operator= (float); complex<float>& operator+=(float); complex<float>& operator-=(float); complex<float>& operator*=(float); complex<float>& operator/=(float); complex<float>& operator=(const complex<float>&); template<class X> complex<float>& operator= (const complex<X>&); template<class X> complex<float>& operator+=(const complex<X>&); template<class X> complex<float>& operator-=(const complex<X>&); template<class X> complex<float>& operator*=(const complex<X>&); template<class X> complex<float>& operator/=(const complex<X>&); }; template<> class complex<double> { public: typedef double value_type; constexpr complex(double re = 0.0, double im = 0.0); constexpr complex(const complex<float>&); explicit constexpr complex(const complex<long double>&); constexpr double real(); void real(double); constexpr double imag(); void imag(double); complex<double>& operator= (double); complex<double>& operator+=(double); complex<double>& operator-=(double); complex<double>& operator*=(double); complex<double>& operator/=(double); complex<double>& operator=(const complex<double>&); template<class X> complex<double>& operator= (const complex<X>&); template<class X> complex<double>& operator+=(const complex<X>&); template<class X> complex<double>& operator-=(const complex<X>&); template<class X> complex<double>& operator*=(const complex<X>&); template<class X> complex<double>& operator/=(const complex<X>&); }; template<> class complex<long double> { public: typedef long double value_type; constexpr complex(long double re = 0.0L, long double im = 0.0L); constexpr complex(const complex<float>&); constexpr complex(const complex<double>&); constexpr long double real(); void real(long double); constexpr long double imag(); void imag(long double); complex<long double>& operator=(const complex<long double>&); complex<long double>& operator= (long double); complex<long double>& operator+=(long double); complex<long double>& operator-=(long double); complex<long double>& operator*=(long double); complex<long double>& operator/=(long double); template<class X> complex<long double>& operator= (const complex<X>&); template<class X> complex<long double>& operator+=(const complex<X>&); template<class X> complex<long double>& operator-=(const complex<X>&); template<class X> complex<long double>& operator*=(const complex<X>&); template<class X> complex<long double>& operator/=(const complex<X>&); }; }