Frage

Das C ++ Programm

#include <complex>
#include <iostream>

int main()
{
  std::complex<double> z(0,2);
  int n = 3;
  std::cout << z * n << std::endl;
}

ergibt einen Fehler: keine Übereinstimmung für ‚operator *‘ in ‚z * n‘. Warum?

Ich bin Kompilieren mit g ++ 4.4.1. Vielleicht ist der Compiler folgt nur die C ++ Standard, wobei in diesem Fall meine Frage ist: warum der Standard nicht zulassen

War es hilfreich?

Lösung

Das funktioniert:

#include <complex>
#include <iostream>

int main()
{
    std::complex<double> z(0,2);
    double n = 3.0; // Note, double
    std::cout << z * n << std::endl;
}

Da Komplex von Doppel besteht, multipliziert sie mit Doppelzimmer. Mit Blick auf die Erklärung:

template <typename T>
inline complex<T> operator*(const complex<T>&, const T&);

(Hier finden Sie dank dribeas ) Der Compiler ist nicht erlaubt implizite Typumwandlungen während der Vorlage Abzug zu machen, so durch eine complex mit T ist double vorbei, und dann noch einen T ist int, wenn man versucht, die Funktion entsprechen Behandlung von T als double die zweite verursacht Argument zu mis-match, und umgekehrt.

Für das, was Sie arbeiten wollen, müsste sie eine Funktion definiert ähnlich wie diese haben:

template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
    return lhs *= rhs;
}

Welche ermöglicht die Funktion zu übernehmen Arten unterscheiden, was die Besetzung erlaubt zu tun, wenn operator*= aufrufen.

Andere Tipps

std::complex<T> die Betreiber sind definiert als ihre Argumente andere complex<T> Instanzen zu nehmen. Der Weg von einem int über eine double zu einem complex<double> nur marginal zu verzerrtem / gewundener für die C ++ Sprache es zu folgen nach der Norm (und mit den großen Komplikationen bereits von Freilauf- Umwandlungen entstehen und cohercions es ist schwer zu kritisieren dass Aspekt des Standard). Ich denke, den Super-Sonderfall complex<double> ermöglicht uncasted ints als Operand zu machen war einfach nicht häufig und wichtig genug erachtet zu rechtfertigen Vorlage Spezialisierungen für diesen extrem Einzelfall spezifiziert, wenn man bedenkt, wie trivial einfach ist es für die Programmierer der int zu gieße double, wenn das ist, was sie eigentlich wollen -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top