Multiplying complex with constant in C++

Clash Royale CLAN TAG#URR8PPPMultiplying complex with constant in C++
The following code fails to compile
#include <iostream>
#include <cmath>
#include <complex>
using namespace std;
int main(void)
{
const double b=3;
complex <double> i(0, 1), comp;
comp = b*i;
comp = 3*i;
return 0;
}
with
error: no match for ‘operator*’ in ‘3 * i’
What is wrong here, why cannot I multiply with immediate constants? b*i works.
3 Answers
3
In the first line:
comp = b*i;
The compiler calls:
template<class T> complex<T> operator*(const T& val, const complex<T>& rhs);
Which is instanced as:
template<> complex<double> operator*(const double& val, const complex<double>& rhs);
In the second case, there is no appropriate template int, so the instancing fails:
int
comp = 3.0 * i; // no operator*(int, complex<double>)
See http://www.cplusplus.com/reference/std/complex/complex/operators/ for an overview of the complex operators.
You will notice that the operator* is a template and will use the template parameter of the complex class to generate that code. The number literal you use to invoke operator* is of type int. Use comp = 3. * i;
comp = 3. * i;
the std::complex class is a little bit stupid... define these to allow automatic promotions:
std::complex
// Trick to allow type promotion below
template <typename T>
struct identity_t { typedef T type; };
/// Make working with std::complex<> nubmers suck less... allow promotion.
#define COMPLEX_OPS(OP)
template <typename _Tp>
std::complex<_Tp>
operator OP(std::complex<_Tp> lhs, const typename identity_t<_Tp>::type & rhs)
{
return lhs OP rhs;
}
template <typename _Tp>
std::complex<_Tp>
operator OP(const typename identity_t<_Tp>::type & lhs, const std::complex<_Tp> & rhs)
{
return lhs OP rhs;
}
COMPLEX_OPS(+)
COMPLEX_OPS(-)
COMPLEX_OPS(*)
COMPLEX_OPS(/)
#undef COMPLEX_OPS
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.