fxsaber: 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-up-Fenster blockiert?
Sergei Vladimirov: 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)*/ }; voidOnStart() { B b; //не const B b.f( 0 ); //(*)
}
Hier in (*) ist der Aufruf A::f/*(2)*/ im Aggregat (unter Berücksichtigung von nicht const B b ) wahrscheinlicher als
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
class A { public: 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)*/ }; voidOnStart() { B b; //не const B b.f( 0 ); //(*)
}
Hier in (*) ist der Aufruf A::f/*(2)*/ in Summe (unter Berücksichtigung von nicht const B b ) mehr
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
class A { public: void f( int i ) const {} void f( uint i ) {} }; void OnStart() { A a; a.f((int)0 ); }
fehlerhaft, und das MMS ist gut
Was ist Ihr C++-Compiler? Ich habe gcc und alles geht ohne Fehler
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.
Nun, wenn Sie const A zu a; machen, dann sollte (1) aufgerufen werden. Wenn nicht, liegt es im Ermessen des Compilers. D.h. es kann keine Einzigartigkeit geben. Und es ist nicht klar, warum ein solcher Code geschrieben werden sollte.
fxsaber: 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
A100: 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?
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
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;
}