Multiplying complex with constant in C++

Atilla Filiz picture Atilla Filiz · Apr 15, 2010 · Viewed 10.2k times · Source

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.

Answer

greyfade picture greyfade · Apr 15, 2010

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>)