Это работает:
#include <complex>
#include <iostream>
int main()
{
std::complex<double> z(0,2);
double n = 3.0; // Note, double
std::cout << z * n << std::endl;
}
Поскольку комплекс состоит из двойников, он умножается на двойники. Глядя на декларацию:
template <typename T>
inline complex<T> operator*(const complex<T>&, const T&);
(благодаря dribeas ) компилятору не разрешено делать неявные преобразования типов во время вывода шаблона, поэтому, передавая complex
с T , являющимся double
и затем другой T , являющийся int
, при попытке сопоставить функцию, трактующую T как double
, приводит к несовпадению второго аргумента, и наоборот.
Для того, что вы хотите работать, должна быть определена функция, подобная этой:
template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
return lhs *= rhs;
}
Что позволяет функции принимать разные типы, что позволяет выполнять приведение при вызове operator*=
.