Warum ist complexdouble * int in C ++ nicht definiert?

8

Das C ++ Programm

%Vor%

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

Ich kompiliere mit g ++ 4.4.1. Vielleicht folgt der Compiler nur dem C ++ - Standard. In diesem Fall lautet meine Frage: Warum lässt der Standard das nicht zu?

    
Jitse Niesen 29.10.2009, 05:52
quelle

2 Antworten

14

Das funktioniert:

%Vor%

Da der Komplex aus Doppelzahlen besteht, multipliziert er sich mit Doppelpunkten. Blick auf die Erklärung:

%Vor%

(Das Folgende ist dank dribeas ) Der Compiler darf keine impliziten Typkonvertierungen während der Vorlagenableitung vornehmen indem ein complex übergeben wird, wobei T double ist, und dann ein anderes T int ist, wenn versucht wird, die Funktion T as double bewirkt, dass das zweite Argument nicht übereinstimmt und umgekehrt.

Für was Sie arbeiten möchten, müsste es eine Funktion haben, die ähnlich wie folgt definiert ist:

%Vor%

Dies ermöglicht der Funktion, unterschiedliche Typen zu verwenden, wodurch die Umwandlung beim Aufruf von operator*= ermöglicht wird.

    
GManNickG 29.10.2009, 05:56
quelle
2
Die Operatoren

std::complex<T> definieren andere complex<T> -Instanzen als Argumente. Die Route von einem int über ein double zu einem complex<double> ist für die C ++ - Sprache nur geringfügig zu verzerrt / verdreht, um sie dem Standard zu folgen (und mit den enormen Komplikationen, die bereits durch Freilaufkonversionen und -kohären entstehen) Es ist schwer, diesen Aspekt des Standards zu kritisieren. Ich schätze, der super-spezielle Fall, dass complex<double> uncasted int s als Operanden für seine Operatoren erlaubt, wurde einfach nicht als häufig und wichtig genug angesehen, um Spezialisierungen für diesen extrem individuellen Fall zu spezifizieren, wenn man bedenkt, wie einfach es für den Programmierer ist um die int auf double zu transformieren, wenn sie das eigentlich wollen ! -)

    
Alex Martelli 29.10.2009 06:03
quelle

Tags und Links