to działa:
#include <complex>
#include <iostream>
int main()
{
std::complex<double> z(0,2);
double n = 3.0; // Note, double
std::cout << z * n << std::endl;
}
Ponieważ kompleks składa się z podwójnej, to mnoży się podwaja. Patrząc na deklaracji:
template <typename T>
inline complex<T> operator*(const complex<T>&, const T&);
(Poniżej dzięki dribeas) Kompilator nie jest dozwolone, aby niejawne konwersje typów podczas szablonu dedukcji, więc przez przepuszczenie complex
z T będąc double
, a potem jeszcze T będąc , próbując dopasować funkcję traktując T jako double
powoduje, że drugi argument źle pasuje, i na odwrót.
Do czego chcesz pracować, to mieć funkcja zdefiniowana podobny do tego:
template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
return lhs *= rhs;
}
który umożliwia funkcja do podjęcia różnych typów, co pozwala obsady do zrobienia podczas wywoływania operator*=
.
myślę jego ponieważ kompleks jest klasa, a * jest przeciążony dla tej klasy, to nie prymitywny tak nie wynika odlewania zasady w kompilator – ldog
Dzięki Poprawiłem błąd związany z niejednoznacznością i błędem prawidłowego zakodowania operatora. (Powinienem zrobić drugi, ale pierwszy jest dla mnie lekcją.) – GManNickG
Implementacja operatora, który pierwotnie dostarczyłeś, nie była niepoprawna, tylko poprawna (a przy zwykłym projekcie różnica byłaby raczej mała). –