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.
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:
comp = 3.0 * i; // no operator*(int, complex<double>)