Fehler, Irrtümer, Fragen - Seite 2271

 
A100:
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.

 
Vladimir Pastushak:

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?

 
fxsaber:

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

 
A100:

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& )

 
fxsaber:

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)

 
fxsaber:
Und wenn die Klasse global ist, welche Zeile erzeugt dann C++?

void f<::A>( ::A& )

void f<A>( A& )

Die zweite Variante

 
A100:

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.

 
Georgiy Merts:

Wenn Sie Klassen (3)(4) außerhalb von Funktionen deklarieren, treten keine Fehler auf. Wenn Sie innerhalb einer Funktion deklarieren, treten Fehler auf.

Wenn im Ausgangsbeispiel
        class  A2 { int i; }; //(3)

ersetzen durch

        interface  A2 {};      //(5)

Wenn Sie innerhalb einer Funktion deklarieren, treten auch keine Fehler auf... Worin besteht der grundlegende Unterschied?

 
fxsaber:

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?

template<typename T>
void f() { Print(__FUNCSIG__); }
void g1() { class A { int    x; } a; f<A>(); }
void g2() { class A { double x; } a; f<A>(); }
void OnStart()
{
        g1();
        g2();
}

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?

 
A100:

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.