Fehler, Irrtümer, Fragen - Seite 2272

 
fxsaber:

Man wird nur erschaffen. Außerdem werden Sie in f nicht in der Lage sein, T zu verwenden.

Dies ist an sich schon ein Fehler.
template<typename T>
void f() { Print( sizeof( T )); }
struct A { int a; };
void OnStart()
{
        f<int>(); //(1)//нормально
        f<A>();   //(2)//нормально
struct B { int b; };
        f<B>();   //(3)//Error: 'B' - undeclared identifier
}
Und was ist der grundlegende Unterschied zwischen (1)(2) und (3)?
 
fxsaber:

Außerdem werden Sie in f nicht in der Lage sein, T zu verwenden. Alles in allem ist die Situation für mich offensichtlich.

Außerdem wurde gegen Ihr Verbot, T in f zu verwenden, verstoßen

template<typename T>
void f() { class T; Print(__FUNCSIG__, ":" , sizeof(T)); }
template<typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart()
{
class A {};
        g<A,int   >();
        g<A,double>();
}

Wie Sie sehen können, kompiliert es ohne Fehler, und die Tatsache, dass das Ergebnis absurd ist, ist nicht wichtig, solange alles "erklärbar" ist.

 
Hallo zusammen. Hilfe. Ich kann keine Goldgeschäfte machen, alles funktioniert, aber es sind die Geschäfte, die ich nicht machen kann. Hier sind Screenshots, die zeigen, wie es aussieht.
 

Was ist der heilige Sinn dieses Codes, warum hat man ihn überhaupt in die Standardbibliothek gepackt?

   if(IsStopped(__FUNCTION__))
      return(false);

Es ist nun nicht mehr möglich, Funktionen zum Schließen von Positionen oder Aufträgen aus der Standardbibliothek in OnDeanite zu verwenden, zum Beispiel mit REASON_REMOVE

 
Stanislav Dray:

Was ist der heilige Sinn dieses Codes, warum hat man ihn überhaupt in die Standardbibliothek gepackt?

Jetzt können Sie keine Funktionen zum Schließen von Positionen oder Aufträgen aus der Standardbibliothek in OnDynit verwenden, zum Beispiel mit REASON_REMOVE.

Ja, das ist ein Fehler.

 
A100:

Außerdem habe ich gegen Ihr Verbot verstoßen, T in f zu verwenden.

Wie Sie sehen, kompiliert es ohne Fehler, und die Tatsache, dass das Ergebnis absurd ist, ist nicht wichtig - die Hauptsache ist, dass alles "erklärbar" ist.

Sie verstehen nicht ganz, was Vorlagen sind. Sie sind ähnlich wie Makros, nur mit bestimmten Funktionen.

Hier ist der Code

template<typename T>
void f() { class T{ MqlTick a; }; Print(__FUNCSIG__, ":" , sizeof(T)); }
template<typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart()
{
class A {};
        g<A,int   >();
        g<A,double>();
}

.

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

Das liegt daran, dass T eine Einrichtung ist, wie Makros, nur mit bestimmten Einschränkungen. Am Ende wird eine Signatur erstellt. Innerhalb der Funktion weiß niemand von A, das in der Funktion durch T ersetzt wird. Aber Sie definieren dieses A innerhalb, so dass kein weiterer Kompilierungsfehler auftritt. Ich habe MqlTick eingefügt, um zu zeigen, dass dieses A nichts mit anderen Klassen desselben Namens zu tun hat.

Kurz gesagt, die Intraklassen in MQL5 sind außerhalb der übergeordneten Funktion nicht sichtbar. Als T wird nur der Name des Typs als Klasse übergeben. In diesem Fall hat der Name keinen Verweis auf die übergeordnete Funktion.

Das heißt, alles ist ganz logisch erklärbar. Es ist kein Fehler, sondern eine so begrenzte Implementierung.


Vielleicht würde ein C++-Programmierer bei einem Vorstellungsgespräch sagen, dass dies unmöglich ist.

template<typename T>
void f() { class T{}; }


MQL5 ist durchaus möglich.

 
fxsaber:

Sie verstehen nicht ganz, was Muster sind.

fxsaber:

ZS Wahrscheinlich wird Ihnen ein C++-Programmierer bei einem Vorstellungsgespräch sagen, dass dies unmöglich ist

Wenn Sie glauben, dass dies in C++ unmöglich ist, bedeutet das, dass nicht ich, sondern Sie nicht verstehen, was Templates sind und wie sie funktionieren... umso mehr, dass man eine schlampige Umsetzung nicht von einer eingeschränkten unterscheiden kann

 
A100:

Wenn Sie glauben, dass so etwas in C++ unmöglich ist, dann liegt das nicht an mir, sondern daran, dass Sie nicht verstehen, was Templates sind und wie sie funktionieren... um so mehr, als man eine schlampige Umsetzung nicht von einer begrenzten unterscheiden kann

Lesen Sie das erste Wort des Satzes, zu dem Sie Ihren Kommentar abgeben. Mein Verständnis von Vorlagen und Makros in MQL5 ist so, dass ich ohne zu versuchen, zu kompilieren, dass Ihre Beispiele nicht in MQL5 kompilieren wird. C++ - Ich weiß es nicht, das verhindert es nicht.


Ich wäre Ihnen dankbar, wenn Sie zeigen könnten, wie C++ auf diesen Code reagiert

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

fxsaber, 2018.09.03 07:16

ZS Wahrscheinlich wird Ihnen ein C++-Programmierer bei einem Vorstellungsgespräch sagen, dass dies unmöglich ist

template<typename T>
void f() { class T{}; }
 
fxsaber:

Ich würde es begrüßen, wenn Sie mir zeigen könnten, wie C++ auf diesen Code reagiert.

Die Reaktion ist die gleiche wie bei MMS. Warum sollte es anders sein? Eine Vorlage ist eine Vorlage
 
fxsaber:

Sie verstehen nicht wirklich, was Vorlagen sind. Und sie sind ähnlich wie Makros, nur mit einigen Tricks.

Ja, dieses Beispiel lässt sich nicht mit den Pluszeichen kompilieren.

Fehler: Deklaration von 'struct f()::T' schattet template param template<typename T>

aber selbst wenn es kompiliert würde, würde das Ergebnis überraschen, weil der Klassenname einfach "T" wäre.

wenn es in mql anders ist, ist dies falsch