Следующему коду не удается скомпилировать
#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;
}
с ошибкой: никакое соответствие для ‘оператора*’ в ‘3 * я’ Что не так здесь, почему я не могу умножиться с непосредственными константами? работы b*i.
В первой строке:
comp = b*i;
Компилятор вызывает:
template<class T> complex<T> operator*(const T& val, const complex<T>& rhs);
Который представлен как:
template<> complex<double> operator*(const double& val, const complex<double>& rhs);
Во втором случае нет подходящего template int
, поэтому создание экземпляра не удается:
comp = 3.0 * i; // no operator*(int, complex<double>)
См. http://www.cplusplus.com/reference/std/complex/complex/operators/ для обзора сложные операторы.
Вы заметите, что оператор * является шаблоном и будет использовать параметр шаблона сложного класса для генерации этого кода. Числовой литерал, который вы используете для вызова оператора *, имеет тип int. Используйте comp = 3. * i;