Fehler, Irrtümer, Fragen - Seite 2653

 
Vladimir Simakov:

Nun, STL ist keine Einheitslösung für alle. Hier muss man sehr genau auf die Details achten.

Du verwechselst "weich" mit "warm".
Das ist keine Frage der STL. Ich werde es dort selbst herausfinden... (wenn jemand es nicht hat, heißt das nicht, dass es nicht prinzipiell möglich ist)

Der einfachste Weg, alle möglichen Funktionen mit abstrakten Methoden in einer Basisklasse oder Schnittstelle zu implementieren, und in den Nachkommen - entweder Implementierung oder =delte.
In diesem Fall müssen Sie Zeiger oder Referenzen desselben Typs an die Methoden der Basisklasse übergeben.
Zwar gibt es ein unvermeidliches Übel in Form einer virtuellen Tabelle, aber es ist besser, die Architektur so zu gestalten, dass es nirgendwo zu teuren Verzweigungen über dynamic_cast kommt.

Die von Ihnen vorgeschlagene Methode wurde bereits früher implementiert und beruht ebenfalls auf demselben Fehler:https://www.mql5.com/ru/forum/1111/page2648#comment_15015191


Der Fehler liegt in den Prioritäten des Aufrufs neu geladener Funktionen, wenn eine implizite Typumwandlung für einen Zeiger/Klassenparameter durchgeführt wird.
In C++ ist alles in Ordnung, aber in MQL der Kompilierungsfehler"ambiguous call to overloaded function"
Eine der Workaround-Varianten ist oben vorgeschlagen, aber es ist groß und nicht bequem, und ich habe keine Lust, es für ein Dutzend ähnliche Funktionen zu verwenden.
Vielleicht gibt es etwas Einfacheres?

 
Makros ihre Arbeit tun, gelang es, die Leinwand zu Form (Vollversion in der Anlage Datei) zu reduzieren:
//+------------------------------------------------------------------+
//|  MQL realization                                                 |
//+------------------------------------------------------------------+
#ifdef __MQL5__
   template <typename _InputIter>
   CREATE_MISSED_ITERATOR_FUNCTION_FW_P2(int, distance, _InputIter&, _InputIter&);
   
   template <typename _InputIter>
   CREATE_MISSED_ITERATOR_FUNCTION_RA_P2(int, distance, _InputIter&, _InputIter&);

   template <typename _InputIter>
   CREATE_MAIN_ITERATOR_FUNCTION_P2(int, distance, _InputIter&, _InputIter&, _InputIter);
   
   void OnStart(){
      MyIterator it1(1);
      MyIterator it2(5);
      printf("result:%d", distance(it1, it2));            
   }
#endif 

Entwickler, bitte teilen Sie uns mit, ob es Pläne gibt,den Fehler zu beheben, oder ob dies architektonisch unmöglich ist?
Dateien:
 
Fehler MT5 (Build 2323),
Innerhalb einer Template-Funktion verhält sich ein übergebener Zeiger innerhalb einer expliziten Typkonvertierung wie eine Klasse und verursacht dementsprechend einen Kompilierzeitfehler:
#define  PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
class ClassWrapper{
public:
   T data;
};

class ClassA{};
class ClassB : public ClassA{};


template<typename T, typename TT>
void func(const T &_wrapper, const TT &value){
   T wrapper = _wrapper;   
   
   PRINT(typename(wrapper.data));         // Ok: ClassA*
   PRINT(typename(value));                // Ok: ClassA*
   PRINT(typename(TT));                   // Ok: ClassA*
   
   //wrapper.data = (TT)(value);          // Compiler Error: 'value' - object required  
   //wrapper.data = (TT)(wrapper.data);   // Compiler Error: 'data' - object required   
   
   ClassB b;
   PRINT(typename((TT)(b)));              // Result: C lassA. During explicit type conversion, TT is "ClassA" instead of "ClassA*"
};


void OnStart(){
   ClassWrapper<ClassA*> a_ptr_wrapper;
   
   ClassA a;
   const ClassA* a_ptr = &a;
   func(a_ptr_wrapper, a_ptr);
};
 

Er ist dumm und kann ein einfaches Problem nicht lösen. Ich muss verstehen, dass der Handel während der folgenden EA-Starteinstellungen untersagt ist.


Diese Prüfung funktioniert nicht.

int OnInit()
{
  Alert(AccountInfoInteger(ACCOUNT_TRADE_EXPERT) &&
        AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) &&
        TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)); // true
        
  return(INIT_FAILED);
}


OrderCheck ist ein Ablenkungsmanöver. Bitte beraten Sie mich.

 
bool CheckTradingPermission()
  {
//--- Для режима реального времени
   if(IsRealtime())
     {
      //--- Проверка соединения с сервером
      if(!TerminalInfoInteger(TERMINAL_CONNECTED))
         return(false);
      //--- Разрешение на торговлю на уровне данной запущенной программы
      if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
         return(false);
      //--- Разрешение на торговлю на уровне терминала
      if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         return(false);
      //--- Разрешение на торговлю для текущего счета
      if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
         return(false);
      //--- Разрешение на автоматическую торговлю для текущего счета
      if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
         return(false);
     }
//---
   return(true);
  }
ANATOLI KAZHARSKI Code

Anatoli Kazharski
Anatoli Kazharski
  • www.mql5.com
Опубликовал статью ZigZag всему голова (Часть II): Примеры получения, обработки и отображения данных В первой части был описан модифицированный индикатор ZigZag и класс для получения данных индикаторов такого типа. Теперь мы покажем как создать индикаторы на основе этих инструментов, а также напишем эксперта для тестов, который будет заключать...
 
Fast235:
ANATOLI KAZHARSKI Code

Danke, ich habe das MQL_TRADE_ALLOWED nicht bemerkt.

 
fxsaber:

Er ist dumm und kann ein einfaches Problem nicht lösen. Ich muss verstehen, dass der Handel während der folgenden EA-Starteinstellungen untersagt ist.


Diese Prüfung funktioniert nicht.


OrderCheck ist ein Ablenkungsmanöver. Bitte beraten Sie mich.

Ich bin mir auf meinem Handy nicht sicher, aber hier ist es:MQL_TRADE_ALLOWED
 
Fehler MT5(build 2323), das gleiche Template-Objekt B<int> kann nach einem Objekt der Klasse B<void*> erstellt werden, aber wenn dies vorher geschieht, tritt ein Kompilierungsfehler auf.
Wahrscheinlich ist der Grund dafür die Arbeit des Cache-Generators für Vorlagenklassen.

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

void OnStart (){ 
   //B<int> b_int_0;    // Compiler Error  'void' - unexpected token, probably type is missing?
   B<void*> b;          // OK
   B<int> b_int_1;      // OK
}
 

Fehler MT5 (Build 2340) verwendet denselben Code zweimal: erster Durchlauf - erfolgreiche Kompilierung, zweiter Durchlauf - Kompilierungsfehler.
Offenbar hängen die Probleme mit dem Cache des Template-Funktionsgenerators zusammen.

Der Fehler verschwindet, wenn für die Template-Funktion "
void run(const T &ff)" die Übergabe per Referenz durch die Übergabe per Wert"void run(const T ff)" ersetzt wird.

void func(){
}

template<typename T>
void run(const T &ff){
   ff();
}

void OnStart (){ 
   {
      typedef void(*f_ptr)();
      f_ptr ff = func;
      run(ff);             // OK
   }
   {
      typedef void(*f_ptr)();
      f_ptr ff = func;
      run(ff);            // Compile Error: 'ff' - parameter conversion not allowed     
   }
}
 

Fehler MT5(build 2340) Kompilierungsfehler beim Versuch, auf die interne Klasse für einen Template-Parameter einer Template-Funktion zuzugreifen.

class B{
public:
   class C{};
};


// Bypass Compile Error
template<typename T>
class GetClassType{
public:
   class type : public T{};
};


template<typename T>
void func(const T &b){
   T::C* c_ptr = new T::C;          // Compile Error: 'T' - struct undefined    
   
   // Bypass Compile Error
   GetClassType<T>::type::C* c_ptr_bps = new GetClassType<T>::type::C();
};

void OnStart (){ 
   B b;
   func(b);
}
Grund der Beschwerde: