Esto funciona:
#include <complex>
#include <iostream>
int main()
{
std::complex<double> z(0,2);
double n = 3.0; // Note, double
std::cout << z * n << std::endl;
}
Debido complejo se compone de dobles, se multiplica con dobles. En cuanto a la declaración:
template <typename T>
inline complex<T> operator*(const complex<T>&, const T&);
(El siguiente es gracias a dribeas) El compilador no se le permite realizar conversiones de tipo implícitas durante la deducción de la plantilla, por lo que al pasar una complex
con T siendo double
, y luego otro T siendo int
, al intentar hacer coincidir la función que trata T como double
hace que el segundo argumento se desajuste, y viceversa.
Por lo que se quiere trabajar, que tendría que tener una función definida similar a esto:
template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
return lhs *= rhs;
}
que permite a la función para tomar tipos diferentes, lo que permite que el yeso se puede hacer cuando se llama a operator*=
.
creo que es porque compleja es una clase y el * está sobrecargado para esa clase, que no es un primitivo para que no se siga echando reglas en el compilador – ldog
Gracias , He corregido el error sobre ambigüedad y mi falla al codificar el operador correctamente. (Debería haber hecho el segundo, pero el primero es una lección para mí.) – GManNickG
La implementación del operador que proporcionó inicialmente no era incorrecta, solo se podía mejorar (y en un proyecto regular, la diferencia sería bastante pequeña). –