Errores, fallos, preguntas - página 2653

 
Vladimir Simakov:

Pues bien, el STL no es una solución única. Aquí hay que prestar mucha atención a los detalles.

Confundes lo suave con lo cálido.
No es una cuestión de STL. Lo resolveré yo mismo... (si alguien no lo tiene, no significa que no se pueda hacer en principio)

La forma más fácil de implementar toda la funcionalidad posible con métodos abstractos en una clase base o interfaz, y en los descendientes - ya sea la implementación o =delte.
En este caso, es necesario pasar punteros o referencias del mismo tipo a los métodos de la clase base.
Aunque hay un mal inevitable en la forma de una tabla virtual, pero es mejor arreglar la arquitectura de tal manera que no haya ramificaciones dinámicas_cast costosas en ninguna parte.

El método que sugieres fue implementado anteriormente y también depende del mismo error:https://www.mql5.com/ru/forum/1111/page2648#comment_15015191


El error está en las prioridades de llamada a funciones recargadas cuando se realiza una conversión de tipo implícita para un parámetro de puntero/clase.
En C++ todo está bien, pero en MQL el error de compilación"llamada ambigua a una función sobrecargada"
Una de las variantes de solución se sugiere arriba, pero es grande y no es conveniente, y no tengo ningún deseo de usarlo para una docena de funciones similares.
¿Quizás haya algo más sencillo?

 
Las macros hacen su trabajo, lograron reducir el lienzo a la forma (versión completa en el archivo adjunto):
//+------------------------------------------------------------------+
//|  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 

Desarrolladores, por favor avisen, ¿hay algún plan para arreglarel error o es arquitectónicamente imposible?
Archivos adjuntos:
 
Bug MT5(build 2323),
Dentro de una función de plantilla, un puntero pasado dentro de una conversión de tipo explícita se comporta como una clase, causando un error de compilación en consecuencia:
#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);
};
 

Tonto, no puede resolver un simple problema. Necesito entender que el comercio está prohibido durante la siguiente configuración de inicio de EA.


Esta comprobación no funciona.

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


OrderCheck es una pista falsa. Por favor, avisa.

 
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);
  }
CódigoANATOLI KAZHARSKI

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

Gracias, no me di cuenta del MQL_TRADE_ALLOWED.

 
fxsaber:

Tonto, no puede resolver un simple problema. Necesito entender que la negociación está prohibida durante los siguientes ajustes de inicio del EA.


Esta comprobación no funciona.


OrderCheck es una pista falsa. Por favor, avisa.

No estoy seguro desde mi móvil, pero aquí está:MQL_TRADE_ALLOWED
 
Bug MT5(build 2323), el mismo objeto de plantilla B<int> puede ser creado después de un objeto de clase B<void*>, pero si se hace antes, se produce un error de compilación.
Probablemente la razón sea el trabajo de la caché del generador de clases de plantillas.

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
}
 

Bug MT5(build 2340) utiliza el mismo código dos veces: primera pasada - compilación exitosa, segunda pasada - error de compilación.
Aparentemente los problemas están relacionados con la caché del generador de funciones de plantilla.

El error desaparece si para la función de plantilla "
void run(const T &ff)" se sustituye la transferencia por referencia por la transferencia por valor"void run(const T ff)".

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     
   }
}
 

Bug MT5(build 2340) Error de compilación al intentar acceder a la clase interna de un parámetro de plantilla de una función de plantilla.

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);
}