Fehler, Irrtümer, Fragen - Seite 2682

 

MT5-Fehler (Build 2367) Die Ausführungsprioritäten von Vorlagenfunktionen in MQL entsprechen nicht denen in C++ (online: https://onlinegdb.com/B172m1PLL).
Es scheint, dass im Rahmen der Fehlerbehebung der Kompilierungsfehler behoben wurde, aber die Ausführungspriorität von überladenen Template-Funktionen ist immer noch nicht mit dem C++-Verhalten abgestimmt.

template<typename T>
struct B{
   T data;
};

template<typename T>
struct BB : public B<T>{};


template<typename T>                                             
struct A{
public:
   static void test(T& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};

                                         
struct AA{
public:
   static void test(B<int>& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};
      

void OnStart(){
   BB<int> bb;
   
   A<B<int>>::test(bb);         // MQL:2,  should be 1     
   AA::test(bb);                // MQL:2,  should be 1     
}
 

Ich bin auf ein komisches Problem gestoßen. Es ist nicht möglich, einen Schablonentyp mit mehreren Typen-Parametern an ein Makro zu übergeben, da der Präprozessor nicht weiß, dass es sich um eine Schablone handelt und die Parameter durch Kommata voneinander trennt.

Ich habe die Beschreibung des Problems und seine Lösung für C++ in der SO gefunden.

#define  COMMA ,
#define  XYZ(type) {type ptr;}

XYZ(TemplatedType<A COMMA B>); // ошибка

Ich habe es in MQL versucht, aber leider hat es nicht funktioniert. Der Compiler gibt einen Fehler "undeklarierter Bezeichner" für eine Variable, die durch den übergebenen Typ beschrieben wird.

Bislang bin ich mit einer zusätzlichen abgeleiteten Klasse ausgekommen, aber kann ich das wie in C++ korrigieren?

Ups. Ich habe eine Lösung gefunden. Das funktioniert folgendermaßen:

#define  COMMA() ,
Die Frage ist damit vom Tisch.
Passing a template type into a macro
Passing a template type into a macro
  • 2017.05.30
  • bitmaskbitmask 22.3k1111 gold badges7070 silver badges133133 bronze badges
  • stackoverflow.com
I have a macro that takes a number of arguments, one of which is a type. For instance: If I try to instantiate this with a template type, say: This will not work as intended, as the pre-processor knows nothing of templates. It will...
 

MT5-Fehler (Build 2367): Der Ort der überladenen Template-Funktionen beeinflusst das Kompilierungsergebnis.
Das ursprüngliche Ticket, unter dem die Arbeit durchgeführt wurde -https://www.mql5.com/ru/forum/1111/page2655#comment_15119627
C++ online(https://onlinegdb.com/BJzbH2DLL).


class input_iterator_tag  {};
class forward_iterator_tag       : public input_iterator_tag         {};
class bidirectional_iterator_tag : public forward_iterator_tag       {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  forward_iterator_tag*  tag){
   printf("2\r\n");
   return set_value(it, value, (input_iterator_tag*)NULL);                // 'set_value' - ambiguous call to overloaded function        
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  bidirectional_iterator_tag*  tag){
   printf("3\r\n");
   return set_value(it, value, (forward_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const random_access_iterator_tag* tag){
   printf("4\r\n");
   return set_value(it, value, (bidirectional_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &val,  _Tp &value, const input_iterator_tag* tag){
   printf("1\r\n");
   return val;
};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it, _Tp &value){
   return set_value(it, value, it.tag);                        
};


template<typename T>
struct A{
   T data;
   static random_access_iterator_tag* tag;
};

template<typename T>
random_access_iterator_tag* A::tag = NULL;

class B{};


void OnStart (){ 
   A<B*> it;
   const B* const b_ptr = new B();
   set_value(it, b_ptr);                                      
   
   A<int> it_int;
   const int value_int = 5;
   set_value(it, value_int);         
}

int main(){
   OnStart();
   return 0;
};
 

Defekte in der Template-Funktion/Klassen-Cache-Operation:
(behoben durch MT5(build 2368)) ***(up) Undefiniertes Verhalten, Sie erstellen ein komplexes umhülltes Objekt mit internem Typ "C" mehrmals und es stellt sich heraus, dass es ein völlig anderer Datentyp ist, vielleicht "B", vielleicht "int", was immer Sie wollen...
(behoben durch MT5(build 2368)) * Kompilierfehler, Fehler bei der Übergabe eines Funktionszeigers als const ref Template-Argument.
(behoben durch MT5(build 2368)) * Kompilierfehler, das B<int>-Objekt kann nach dem B<void*>-Objekt erstellt werden, aber ein Kompilierfehler tritt auf, wenn es vorher gemacht wird.


Defekte in der Funktion/Klasse der Vorlage:
(behoben durch MT5(build 2368)) ***(up) Kompilierfehler, Fehler in Template-Funktion, übergebener Zeiger innerhalbexpliziter Typkonvertierung verhält sich sonst wie eine Klasse.
(behoben durch MT5(build 2368)) **(up) Compile Error, Fehler beim Versuch, auf die interne Klasse für einen Template-Parameter einer Template-Funktion zuzugreifen.
(nicht behoben durch MT5(build 2368)) *** Compile Error, die Hauptbeschwerde ist eine unangemessene Ausgabewarnung - "veraltetes Verhalten, versteckte Methodenaufrufe werden in einer zukünftigen MQL-Compilerversion deaktiviert". Die aktuelle Implementierung schießt Vögel mit einer Feder.
(nicht behoben durch MT5(build 2368)) ** Der Fehler betrifft den Rückgabewert einer Template-Funktion, wenn der Rückgabewert eine interne Klasse innerhalb einer Template-Klasse ist, deren Parametertyp durch den Argumenttyp der Template-Funktion festgelegt ist.
(nicht behoben durch MT5(build 2368)) ** Kompilierfehler, Namespace- und Scope-Fehler im Template-Konstruktor beim Aufruf einer Basisklasse, wenn der gleiche Klassenname in der Vererbung und in der internen Klasse verwendet wird.
(nicht behoben durch MT5(build 2368)) * Kompilierfehler, Fehler beim Aufruf von Template-Funktionen mit expliziten Argumenttypen, wenn diese von einer überladenen Nicht-Template-Funktion aufgerufen werden.
(nicht behoben durch MT5(build 2368)) Kompilierfehler, Fehler bei der internen Klassendefinition - kein Verweis auf globalen Namespace bei der Definition einer Basisklasse.
(behoben durch MT5(build 2368)) ** Kompilierfehler, Fehler bei der Generierung von Template-Klassencode bei Verwendung einer internen Klasse.
(behoben durch MT5(build 2368)) ** Kompilierfehler, Fehler bei der Generierung von Template-Methoden/Klassen, der Prozess der automatischen Substitution von Template-Parametern liegt außerhalb des Scops im Hauptprogrammcode.
(behoben durch MT5(build 2368)) * Kompilierfehler, Fehler bei fehlender automatischer Generierung von Template-Klassen-Code, wenn Template-Klasse als Rückgabewert für Template-Methode fungiert.
(behoben durch MT5(build 2368)) * Kompilierfehler, Fehler bei der Übergabe einer internen struct an eine Template-Funktion, der resultierendeDatentyp kann nicht als Basisdatentyp für eine andere interne struct in der Template-Klasse verwendet werden.
(behoben durch MT5(build 2368)) * Compile Error, die Prüfung auf wiederverwendete Template-Typnamen wird nicht durchgeführt, wenn eine Template-Funktion innerhalb einer Template-Klasse deklariert wird, was zu unerwartetem Verhalten führt.
(behoben durch MT5(build 2368)) Kompilierfehler, mehrere Defekte im Zusammenhang mit der Rückgabe eines "an Ort und Stelle erstellten" Objekts, wenn das Objekt eine Vorlagenklasse/-struktur ist.
(nicht behoben durch MT5(build 2368)) *( Es ist kein Bug, sondern ein Feature) im Basisklassenkonstruktor ist es unmöglich, einen expliziten Typecast bei der Umwandlung eines Zeigers auf ein Objekt der Basisklasse in einen Zeiger auf die Elternklasse durchzuführen.


Defekte im Zusammenhang mit Inkonsistenzen bei den Prioritäten von Aufrufen überladener Funktionen in MQL gegenüber C++:
(behoben durch MT5(build 2368)) **(up) Kompilierfehler, Aufrufpriorität von überladenen Template-Funktionen hängt tatsächlich vom Template-Parameter-Typ ab, was theoretisch keinen Einfluss auf das Kompilierergebnis hat.
(behoben durch MT5(build 2368)) **(up) Kompilierfehler, wenn die erste überladene Template-Funktion eine vollständig spezialisierte Template-Basisklasse und die zweite eine nicht spezialisierte Template-Basisklasse verwendet.
(nicht behoben durch MT5(build 2368)) ** Compile Error, ein Kompilierfehler tritt bei der Generierung von Code für eine Schablonenfunktion auf, obwohl es eine überladene Schablonenfunktion mit einer passenden Signatur für die übergebenen Parameter gibt.
(nicht behoben durch MT5(build 2368)) * Compile Error, "ambiguous call to overloaded function" wenn überladene Template-Funktionen mit unterschiedlicher Anzahl von Template-Parametern aufgerufen werden.
(behoben durch MT5(build 2368)) *** Kompilierfehler, wenn Klassen A <= B <= C <= D geerbt werden und zwei Überladefunktionen implementiert werden, z.B. eine mit dem Parameter A* und die zweite mit dem Parameter B*, dann führt die Übergabe eines Objekts C* oder D* in einer solchen Funktion in MQL zu einem Kompilierfehler "ambiguous call to overloaded function".
(behoben durch MT5(build 2368)) ** Laufzeit, Prioritätsfehlanpassung bei Aufrufen von überladenen Template-Funktionen.

Defekte im Zusammenhang mit langsamer Funktionsausführung, Code-Optimierungsleistung:
(behoben durch MT5(build 2368)) ** Laufzeit, großer Overhead beim Hinzufügen von einem Element nach dem anderen in ein Array mit ArrayResize, trotz der Tatsache, dass der Speicher für sie reserviert wurde, z.B. Strukturen sind bis zu 7 mal langsamer.


Vorschläge:
(neuer) Link - über die Implementierung von Intellisense-Unterstützung für Namespace-Funktionalität auf der Grundlage von Intellisense-Arbeit für statische Methoden in Klassen.
link- damit Literale und temporäre Variablen als const ref Funktionsargumente übergeben werden können.
Link- beimVerschieben von Projektdateien in der Registerkarte Projekt, für verschobene Dateien, die geöffnet sind und sich in ME-Registerkarten befinden, um ihren Speicherortpfad automatisch zu aktualisieren.
link- zur Einführung der Funktionalität der Typdeklaration in MQL.
link- über die Möglichkeit, die Erzeugung von Standard-Kopierkonstruktoren und Zuweisungsoperatoren zu erzwingen.

 
MT5-Fehler (Build 2368) Kompilierungsfehler bei Verwendung des Standard-Zugriffsmodifikators beim Erben in einer Vorlagenklasse, wenn der Vorlagenparameter als Basisklasse fungiert.
Vorher hat alles funktioniert, aber offenbar wurde im Zuge der Behebung anderer Fehler etwas kaputt gemacht.

class A{};

template<typename T>
class B : T{};            //'A' - unexpected token      

template<typename T>
class BB : private T{};

   
void OnStart(){    
   BB<A> bb;      // Ok
   B<A> b;        // Compile Error: 
}
 

MT5-Bug (Build 2368) Kompilierungsfehler beim Aufruf einer Zuweisungsanweisung über eine explizite Basisklassenangabe. Das Problem tritt beieiner Vorlagenklasse mit Vorlagenparameter als Basisklasse auf.
Vorher hat es funktioniert, aber offenbar ist bei der Behebung anderer Fehler etwas kaputt gegangen.

struct A{
   uchar data;
   void operator=(int n){
      printf("1");
   }
};

template<typename T>
struct B : public T{
   void operator=(int n){
      T::operator=(n);    //'operator' - undeclared identifier  
   }
};

   
void OnStart(){    
   B<A> b;        
   b = 0;
}
 
Hat das MT5-Update vom 08.03.2020 bei allen angefangen, eine springende Handelshistorie zu haben?
Dateien:
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2020.03.22 10:04

mq5 ist in Ordnung. mq4 ist defekt. Sie können TypeToBytes_ExampleScript.mq4 von hier übernehmen. Er kompiliert nur, wenn Sie die Erweiterung in mq5 ändern.

2368 - es hat sich nichts geändert.

 

Über ein MT5-Terminal konnte ich mich jederzeit in ein beliebiges Brokerkonto einloggen. Wenn es bei der ersten Anmeldung ein Problem gab, habe ich einfach die Tools des Terminals benutzt, um den entsprechenden Broker zu suchen und automatisch die Daten seiner Handelsserver abzurufen. Danach konnte ich mich ohne Probleme anmelden.


Heute bin ich zum ersten Mal mit einer Situation konfrontiert (neuer Broker), in der nichts hilft. Ich kann mich nicht anmelden. Im Protokoll steht.

2020.03.25 09:50:33.538  'xxx': no connection to XXX-Server


Ich habe das native Terminal des Brokers heruntergeladen - meldet sich sofort an. Mein Forschungsterminal - auf keinen Fall. Zum ersten Mal eine solche.

Können Sie mir sagen, wie ich ein nicht-natives Terminal in die Lage versetze, eine Verbindung zum Handelskonto herzustellen?

 
fxsaber:

Können Sie mir sagen, wie ich ein nicht-natives Terminal dazu bringen kann, sich mit einem Handelskonto zu verbinden?

In mt4 musste ich die Datei server.ini in ein anderes Terminal kopieren, um nicht nach Handelsservern suchen zu müssen

weiß nicht in mt5

Grund der Beschwerde: