Questo funziona:
#include <complex>
#include <iostream>
int main()
{
std::complex<double> z(0,2);
double n = 3.0; // Note, double
std::cout << z * n << std::endl;
}
Perché complesso si compone di doppi, si moltiplica con doppie. Guardando la dichiarazione:
template <typename T>
inline complex<T> operator*(const complex<T>&, const T&);
(Il seguente è grazie a dribeas) Il compilatore non è consentito effettuare conversioni di tipo implicite nel modello deduzione, così facendo passare un complex
con T essendo double
, e poi un altro T è int
, quando si cerca di far corrispondere la funzione che tratta T come double
causa la corrispondenza errata del secondo argomento e viceversa.
Per quello che si desidera lavorare, si dovrebbe avere una funzione definita simile a questo:
template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
return lhs *= rhs;
}
che permette la funzione di prendere tipi diversi, che permette il cast da compiere quando si chiama operator*=
.
Penso proprio perché complesso è una classe e la * è sovraccarico per quella classe, la sua non è una primitiva in modo che non segue la fusione regole nel compilatore – ldog
Grazie , Ho corretto l'errore relativo all'ambiguità e il mio errore nel codificare correttamente l'operatore. (Avrei dovuto fare il secondo, ma la prima è una lezione per me.) – GManNickG
L'implementazione dell'operatore inizialmente fornito non era errata, solo migliorabile (e in un progetto regolare la differenza sarebbe piuttosto piccola). –