Fehler, Irrtümer, Fragen - Seite 2415

 

Mit dieser Einschränkung wird seit vielen Jahren gelebt.

Die Frage hat sich zum ersten Mal überhaupt gestellt

 
Stanislav Korotky:

Dies ist eine Art drakonische Einschränkung. Was ist der Grund dafür in der heutigen Zeit? Und wie ist es praktisch, Cluster aus einer Reihe von Zeichen anzugeben? Ein Dutzend verschiedener Parameter zu multiplizieren? Ist das praktisch?

Der Grund dafür liegt im Austauschprotokoll mit dem Testagenten.

Um ein Bündel von Zeichen zu setzen, schreiben Sie dieses Bündel in eine Textdatei und übergeben es mit #property tester_file

 

Aber mit einem einzigen Test wird er auch an den Testagenten weitergegeben und funktioniert ohne Einschränkung.

Warum gibt es auch für statische Eingaben eine Einschränkung, sie können gar nicht an den Agenten weitergegeben werden.

Wenn es sich nicht einmal um einen Fehler handelt, sehen Sie es als Verbesserungsvorschlag an.

 
Alexey Navoykov:

Compilerfehler. Er erzeugt einen Mehrdeutigkeitsfehler, obwohl hier alles eindeutig ist.Die erste Methode sollte als die am besten geeignete aufgerufen werden. Getestet in C++.

Wie wird die Best-Fit-Methode definiert?

 
Slava:

Der Grund dafür liegt im Austauschprotokoll mit dem Testagenten.

Um ein Bündel von Zeichen zu spezifizieren, schreiben Sie dieses Bündel in eine Textdatei und übergeben es mit #property tester_file

Wie passt das zu den Produkten für Endverbraucher? Die Begrenzung mag früher gerechtfertigt gewesen sein, aber ich bezweifle das angesichts der anderen Datenmengen, die übertragen werden. Eine Anhebung des Grenzwerts birgt nicht die Gefahr der Unvereinbarkeit.

 
fxsaber:

Wie wird sie als geeignet eingestuft?

Wenn wir über den C++-Standard sprechen, dann:

13.3 Auflösung der Überlast. Die Überladungsauflösung ist ein Mechanismus zur Auswahl der besten aufzurufenden Funktion angesichts einer Liste von Ausdrücken, die die Argumente des Aufrufs sein sollen, und einer Reihe von Kandidatenfunktionen, die auf der Grundlage des Kontextes des Aufrufs aufgerufen werden können. Die Auswahlkriterien für die beste Funktion sind die Anzahl der Argumente, die Übereinstimmung der Argumente mit der Parameter-Typ-Liste der Kandidatenfunktion, die Übereinstimmung des Objekts mit dem impliziten Objektparameter (bei nicht-statischen Memberfunktionen) und bestimmte andere Eigenschaften der Kandidatenfunktion. [Hinweis: Es ist nicht garantiert, dass die durch Überlastauflösung ausgewählte Funktion für den jeweiligen Kontext geeignet ist. Andere Einschränkungen, wie z. B. die Zugänglichkeit der Funktion, können dazu führen, dass ihre Verwendung im aufrufenden Kontext nicht korrekt ist.

Mit anderen Worten: Es sollte folgendermaßen funktionieren:

class A { };

class B
{
  A _a[];
 public:
        A * operator[](uint i)       { return &_a[i]; }
  const A * operator[](uint i) const { return &_a[i]; }  
};

void OnStart()
{
  B b1;
  const B b2;
  b1[0]; // []
  b2[0]; // [] const
}
 
Andrey Pogoreltsev:

Wenn wir über den C++-Standard sprechen, dann:

13.3 Auflösung der Überlast. Die Überladungsauflösung ist ein Mechanismus zur Auswahl der besten aufzurufenden Funktion angesichts einer Liste von Ausdrücken, die die Argumente des Aufrufs sein sollen, und einer Reihe von Kandidatenfunktionen, die auf der Grundlage des Kontextes des Aufrufs aufgerufen werden können. Die Auswahlkriterien für die beste Funktion sind die Anzahl der Argumente, die Übereinstimmung der Argumente mit der Parameter-Typ-Liste der Kandidatenfunktion, die Übereinstimmung des Objekts mit dem impliziten Objektparameter (bei nicht-statischen Memberfunktionen) und bestimmte andere Eigenschaften der Kandidatenfunktion. [Hinweis: Es ist nicht garantiert, dass die durch Überlastauflösung ausgewählte Funktion für den jeweiligen Kontext geeignet ist. Andere Einschränkungen, wie z. B. die Zugänglichkeit der Funktion, können dazu führen, dass ihre Verwendung im aufrufenden Kontext nicht korrekt ist.

Mit anderen Worten: Es sollte folgendermaßen funktionieren:

Für b2, volle Eindeutigkeit. b1 ist nicht.

 
fxsaber:

Wie wird der richtige bestimmt?

In diesem Beispiel wird eine nicht konstante Objektmethode angefordert, so dass sie unter sonst gleichen Umständen aufgerufen werden sollte.

Wenn wir das Casting entfernen und für beide Methoden ein Argument vom Typ int verwenden, lässt sich der Code normal kompilieren. Das Problem in MQL ist also das Casting. Dieses Casting darf den Code nicht beeinflussen, da er identisch ist.

 
fxsaber:

Für b2 besteht völlige Unzweideutigkeit. b1 ist nicht.

Hier besteht kein Bedarf an Eindeutigkeit. Es sollte einfach die Reihenfolge sein, in der die überladenen Methoden angewendet werden. D.h. die Aufgabe bei der Lösung von Überlastungen besteht nicht darin, ein Dilemma zu schaffen, sondern die am besten geeignete Methode zu wählen. Abgesehen vom Zugriffsmodifikator handelt es sich um die erste Methode aus der Tabelle, oder es hängt von der Compiler-Implementierung ab, aber es gibt keine Zweideutigkeit.

Aber wenn es 2 Methoden mit unterschiedlichen Eingabeparametern gäbe, zum Beispiel:

class B
{
  A _a[];
 public:
        A * operator[](int i)  {...}
        A * operator[](bool i) {...}  
};
B b;
b[0];    // ok
b[true]; // ok
b[0 u];   // ambiguous call to overloaded function

Zurück zu C++, der gleiche Vektor hat einen:

reference       operator[]( size_type pos );
const_reference operator[]( size_type pos ) const;

Dies ist also eine ganz normale Situation.

 
Stanislav Korotky:

Wie passt das zu den Produkten für Endverbraucher? Die Begrenzung mag früher gerechtfertigt gewesen sein, aber ich bezweifle das angesichts der anderen Datenmengen, die übertragen werden. Eine Anhebung des Grenzwerts birgt nicht die Gefahr der Unvereinbarkeit.

Zunächst einmal wurden im Optimierungscache sowohl im MT5 als auch im MT4 String-Parameter immer auf 63 Zeichen gekürzt.

Auch beim Senden von Ereignissen darf die Zeichenkette nicht länger als 63 Zeichen sein.

Das heißt, was von außen kommt, ist begrenzt.

Was die Produkte für den Endverbraucher betrifft. Der Verkäufer muss diese Einschränkungen berücksichtigen. Und wenn er sie nicht kennt, dann hat er sein Produkt nicht ausreichend getestet, bevor er es verkauft.