Fehler, Irrtümer, Fragen - Seite 1749
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Ich habe einen Tick-Indikator in Kodobase erstellt. Aber ich kann die Quellen nicht anhängen - ich drücke auf "Dateien anhängen", die Beschriftung verschwindet, aber die Schnittstelle zur Auswahl von Dateien erscheint nicht.
Vielleicht ist ein Adblocker installiert, der alle Pop-ups blockiert?
Ich habe nichts geändert. Vorher hat alles funktioniert.
Wenn ich zur Kasse gehe, drücke ich diese Taste
Es kommt nichts zurück, außer dies.
Ja, ich verstehe Ihre Frage. Es gibt eine Funktion mit einer passenderen Signatur, aber sie kann nicht aufgerufen werden, weil sie geschützt ist. Ja, das Verhalten unterscheidet sich von Studio: In MKL gibt es eine strengere Typkontrolle (in diesem Fall). Ich weiß nicht, ob das als Fehler angesehen werden sollte. Wenn Sie den Typ des an die Funktion übergebenen Arguments kontrollieren, gibt es kein Problem.
Die Kontrolle ist eher selektiv und daher inkonsistent, was hieraus folgt
class A {
}public:
void f( int ) const {} /*(1)*/
void f( int ) {} /*(2)*/
};
class B : public A {
public:
void f( int ) const {} /*(3)*/
};
void OnStart()
{
B b; //не const B
b.f( 0 ); //(*)
Aber C++ analysiert eine Basisklasse nicht immer auf eine geeignetere Methode, wenn die abgeleitete Klasse gerade eine geeignete Methode hat.
Und MQL - im vorigen Beispiel analysierte es die Basisklasse nach einer geeigneteren Methode, während es das in diesem Fall nicht tut (hier wie auch in C++ wird B::f/*(3)*/) aufgerufen, was bedeutet, dass es keinen einheitlichen Ansatz gibt
Ein weiteres Beispiel für inkonsistente Kontrolle: C++ findet folgenden Code
void f( int i ) const {}
void f( uint i ) {}
};
void OnStart()
{
A a;
a.f((int)0 );
}
Die Kontrolle ist eher selektiv und daher inkonsistent, was hieraus folgt
class A {
}public:
void f( int ) const {} /*(1)*/
void f( int ) {} /*(2)*/
};
class B : public A {
public:
void f( int ) const {} /*(3)*/
};
void OnStart()
{
B b; //не const B
b.f( 0 ); //(*)
Aber C++ analysiert eine Basisklasse nicht immer auf eine geeignetere Methode, wenn die abgeleitete Klasse gerade eine geeignete Methode hat.
Und MQL - im vorigen Beispiel analysierte es die Basisklasse nach einer geeigneteren Methode, während es das in diesem Fall nicht tut (hier wie auch in C++ wird B::f/*(3)*/) aufgerufen, was bedeutet, dass es keinen einheitlichen Ansatz gibt
Ein weiteres Beispiel für inkonsistente Kontrolle: C++ findet folgenden Code
void f( int i ) const {}
void f( uint i ) {}
};
void OnStart()
{
A a;
a.f((int)0 );
}
Welchen C++-Compiler verwenden Sie? Ich verwende gcc und alles geht ohne Fehler
void f( int i ) const {} //1
void f( unsigned int i ) {} //2
};
void OnStart()
{
A a;
a.f((int)0 );
}
(1) oder (2). Ich werde nun die Compiler-Meldung einfügen
Das ist wirklich eine strenge Kontrolle: die eine Methode ist besser für die Unterschrift geeignet, die andere für die Konsistenz.
Es handelt sich hierbei um eine strenge Kontrolle: die eine Methode eignet sich besser für die Signatur, die andere für die Beständigkeit.
Und es ist nicht klar, warum Sie so etwas schreiben sollten.
Ersetzen Sie f -> operator[], nehmen Sie Ihr aktuelles Beispiel - überlegen Sie, wie man [] sowohl links als auch rechts machen kann. Fügen Sie Beständigkeit nach Geschmack hinzu - dann verpacken Sie es in eine Schablone und Sie haben etwas Ähnliches.
Wenn machen const - ohne betrachten, wenn
Wenn es keine Eindeutigkeit geben kann, sollten Sie zumindest eine Warnung aussprechen
Ersetzen Sie f -> operator[], nehmen Sie Ihr aktuelles Beispiel - überlegen Sie, wie man [] sowohl links als auch rechts machen kann. Fügen Sie nach Belieben Beständigkeit hinzu - dann verpacken Sie es in eine Schablone und Sie haben etwas Ähnliches.
Um welches Beispiel handelt es sich? Könnten Sie nicht die Quelle angeben, sondern den letzten Eintrag, der funktionieren sollte?
Das Ergebnis sollte in etwa so aussehen
{
A<int> a;
int b = a[ 0 ];
a[ 0 ] = a[ 1 ];
a[ 1 ] = b;
}
Das Endergebnis sollte in etwa wie folgt aussehen
{
A<int> a;
int b = a[ 0 ];
a[ 0 ] = a[ 1 ];
a[ 1 ] = b;
}