Fehler, Irrtümer, Fragen - Seite 1749

 
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?
 
Vladislav Andruschenko:
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.

 
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)*/
};
void OnStart()
{
        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 );
}
fehlerhaft, und die MMS ist gut
 
A100:

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 ); //(*)

}
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
 
coderex:
Welchen C++-Compiler verwenden Sie? Ich verwende gcc und alles geht ohne Fehler
Und welche Funktion ruft der gcc am Ende auf?
class A { public:
        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.

 
A100:

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?
 
fxsaber:
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

void OnStart()
{
        A<int> a;
        int b  = a[ 0 ];
        a[ 0 ] = a[ 1 ];
        a[ 1 ] = b;
}
 
A100:

Das Endergebnis sollte in etwa wie folgt aussehen

void OnStart()
{
        A<int> a;
        int b  = a[ 0 ];
        a[ 0 ] = a[ 1 ];
        a[ 1 ] = b;
}
Sind die Indizes konstant?
Grund der Beschwerde: