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