std::complex
уже определяет operator *
в виде
template< class T >
std::complex<T> operator*( const std::complex<T>& lhs, const T& rhs);
Это противоречит вашему собственному operator *
, поскольку обе функции разрешают принимать std::complex<double>
и double
.
Это означает, что вам действительно нужно определить operator *
для std::vector<float>
и double
, чтобы вы могли изменить свою перегрузку на
std::complex<float> operator*(const std::complex<float> &cd, double d) {
return std::complex<float>(cd.real() * d, cd.imag());
}
А потом
std::cout << cf * d << std::endl;
std::cout << cd * d << std::endl;
будет работать.
Если вы хотите сохранить перегрузку функции шаблона, вы можете использовать SFINAE, чтобы она не компилировалась для случая, когда у вас есть std::complex<double>
с помощью
template <typename T, std::enable_if_t<!std::is_same_v<double, T>, bool> = true>
std::complex<T> operator*(const std::complex<T> &cd, double d) {
return std::complex<T>(cd.real() * d, cd.imag());
}