Fehler, Irrtümer, Fragen - Seite 2271
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ein Kompilierungsfehler:
Was ist der grundlegende Unterschied zwischen (1)(2) und (3)(4)?
Wenn Sie Klassen (3)(4) außerhalb von Funktionen deklarieren, tritt kein Fehler auf. Wenn Sie innerhalb einer Funktion deklarieren, treten Fehler auf.
Worauf lässt sich das folgende Verhalten zurückführen
Der Indikator "Kompilieren" funktioniert richtig, der Indikator "Erneut kompilieren" funktioniert nicht richtig. Funktioniert es im Testgerät korrekt?
Welcher Indikator?
Was produziert C++ hier?
Damit es in MQL5 funktioniert, müssen Sie zwei verschiedene Zeichenketten in der Ausgabe haben, nicht dieselbe. Aber dann sollte der Mechanismus der Signaturbildung völlig anders sein. Wenn C++ in print das gleiche Ergebnis liefert , werden die __FUNCSIG__-Kosten drastisch sinken.
Ergebnis: C++
void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )
Wie Sie sehen können, sind die Saiten unterschiedlich... die Funktionssignatur wird verwendet
Ergebnis: C++
void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )
Wie Sie sehen können, sind die Saiten unterschiedlich... die Funktionssignatur wird verwendet
MQL5 gibt auf.
void f<A>(A&)
D.h. es gibt keine Klassensignatur innerhalb der Funktion. Eines Tages wird es unterstützt werden.
Und wenn die Klasse global ist, welche Zeile wird dann von C++ erzeugt?
void f<::A>( ::A& )
void f<A>( A& )
MQL5 gibt aus
D.h. es gibt keine Klassensignatur innerhalb der Funktion. Eines Tages wird es unterstützt werden.
Wenn veraltete C++-Compiler dies nicht unterstützen, geben sie bereits in der ersten Zeile (1) des Quellcodes einen Fehler aus. Deshalb wurde die Frage überhaupt gestellt: Warum liegt in einem Fall ein Fehler vor und im anderen ein normaler Fehler?
Wir haben in beiden Fällen das gleiche Verhalten erwartet: entweder einen Fehler oder keinen Fehler. Und der Fehler liegt nicht in der mangelnden Unterstützung an sich, sondern im ungleichen Verhalten unter sonst gleichen Bedingungen (wie in diesem Beispiel)
Und wenn die Klasse global ist, welche Zeile erzeugt dann C++?
void f<::A>( ::A& )
void f<A>( A& )
Die zweite Variante
Wenn veraltete C++-Compiler dies nicht unterstützen, geben sie bereits in der ersten Zeile (1) des Quelltextes einen Fehler aus. Deshalb wurde die Frage überhaupt erst gestellt: Warum liegt in einem Fall ein Fehler vor und in einem anderen ein normaler Fehler?
Wir haben in beiden Fällen das gleiche Verhalten erwartet: entweder einen Fehler oder keinen Fehler. Und der Fehler liegt nicht in der mangelnden Unterstützung an sich, sondern im ungleichen Verhalten, wenn alles andere gleich ist (wie in diesem Beispiel)
Nun, das ist leicht zu erklären. Der Compiler geht von oben nach unten durch den Code und bildet dabei entsprechende Signaturen. Die erste Signatur wird ohne Probleme erstellt. Es kommt zur zweiten und da gibt es schon eine solche Unterschrift. Hier haben wir einen Fehler in der zweiten Zeile.
Wenn Sie Klassen (3)(4) außerhalb von Funktionen deklarieren, treten keine Fehler auf. Wenn Sie innerhalb einer Funktion deklarieren, treten Fehler auf.
ersetzen durch
Wenn Sie innerhalb einer Funktion deklarieren, treten auch keine Fehler auf... Worin besteht der grundlegende Unterschied?
Das ist also verständlich. Der Compiler geht von oben nach unten durch den Code und bildet dabei die entsprechenden Signaturen. Die erste Signatur wird ohne Probleme erstellt. Er kommt zum zweiten und hat bereits einen. Daher liegt in der zweiten Zeile ein Fehler vor.
Warum also kompiliert es in MQL ohne Fehler?
Ergebnis: MQL C++
void f<A>() void f<g1::A>()
void f<A>() void f<g2::A>()
Warum werden die Signaturen hier ohne jegliche Einmischung erstellt?
Warum also kompiliert es in MQL ohne Fehler?
Ergebnis: MQL C++
void f<A>() void f<g1::A>()
void f<A>() void f<g2::A>()
Warum werden die Signaturen hier ohne jegliche Einmischung erstellt?
Man wird nur erschaffen. Außerdem können Sie in f nicht T verwenden. Jedenfalls ist die Situation für mich klar.