Errores, fallos, preguntas - página 2674

 

Por favor, recuérdame si hay una forma limpia de resolver el error "llamada ambigua a una función sobrecargada" cuando se necesita un manejo separado para los tipos simples y los punteros, como este:

    template<typename V>
    void process(V value)
    {
    }

    void process(BaseFunctor *ptr)
    {
    }

Aquí el compilador considera que (BaseFunctor *) también corresponde a V. Se puede especificar explícitamente la conversión de tipo cuando se llama a un método, pero es feo. Si toma un parámetro por referencia en una función de plantilla, no puede pasar constantes y otros valores temporales (se requiere una variable).

 
Stanislav Korotky:
intente añadir una sobrecarga con un enlace
 
TheXpert:
intente añadir una sobrecarga con una referencia

¿Te refieres a la sobrecarga con referencia a un objeto o a un puntero (que parece no existir)? No sé cómo deslizar un puntero a una nueva instancia distribuida en una referencia a un objeto.

 
Artyom Trishkin:

Su ciclo no es correcto para cerrar posiciones. Haz un ciclo inverso.

Artyom Trishkin:

Su ciclo no es correcto para cerrar posiciones. Haz un ciclo inverso.

Lo intentaré, pero no importa cómo hacer un bucle si estamos buscando todas las posiciones rentables de la misma dirección. De todos modos, las revisaremos todas y cerraremos las que sean necesarias.

 
Stanislav Korotky:

¿Te refieres a la sobrecarga de la referencia a objetos o a la referencia a punteros (que no parece existir)? No sé cómo deslizar un puntero a una instancia distribuida en una referencia a un objeto.

Con un objeto de referencia.

Lo tengo así:

class C {};

template<typename V>
void process(V value)
{
}

/* если добавить, компилируется
template<typename V>
void process(V& value)
{
}
*/

void process(C *ptr)
{
}
    
void OnStart()
  {
      C c;
      process(&c); // pointer, ok
      process(c); // 'process' - no one of the overloads can be applied to the function call       test2.mq5       32      7
  }
 
TheXpert:

con referencia a los objetos.

Lo tengo así:

Todavía no es tan sencillo, lo siento ;-). La clase se utiliza para la herencia:

class BaseFunctor
{
  public:
    virtual void process() = 0;
};

class MyFunctor: public BaseFunctor
{
  public:
    virtual void process() override
    {
    }
};

template<typename V>
void process(V value)
{
}

void process(BaseFunctor *ptr)
{
}

void process(BaseFunctor &ref)
{
}

void OnStart()
{
  process(new MyFunctor()); // 'process' - ambiguous call to overloaded function, could be one of 3 function(s)
}

Si pudieras crear un BaseFunctor, funcionaría, sí. Pero no es el caso.

 
Pavel Kozlov:

¡Hola!

Gracias por informar del error.

¿Podría explicar el problema de la imagen?

No hay problema por el momento

 

El código siguiente da como resultado 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र

Se supone que la salida de la prueba de texto

Los archivos están en la carpeta Files\\Test\.

La función dice que la manija es correcta es 1 e inmediatamente GetLastError dice error 5008 Manija incorrecta ....

¿Qué debo hacer?

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   core();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
void core()
  {
   string value = "", name = "";

   name =  "Test" + "\\test.csv";
   Print(FileIsExist(name));

   ResetLastError();

   int m_hendle = -1;
   m_hendle = FileOpen(name, FILE_READ | FILE_WRITE | FILE_CSV);
   if(m_hendle != INVALID_HANDLE)
     {
      Print((string)m_hendle + "    " + name + " [" + (string)FileSize(m_hendle) + "]"+ (string)GetLastError());
       while(!FileIsEnding(m_hendle))
        {
         string sCurrent = FileReadString(m_hendle);
         Print("sCurrent = ", sCurrent);
        }
      FileClose(m_hendle);
     }
  }
//+------------------------------------------------------------------+
 
Sergey Dzyublik:
Error muy desagradable en MT5(build 2316), que bloquea el desarrollo posterior.
Creas un objeto complejo envuelto con el tipo interno "C" varias veces, pero resulta ser un tipo de datos muy diferente, tal vez "B", "int", lo que quieras...

Pasé mucho tiempo y esfuerzo para encontrar y entender que el problema no está en el código sino en el compilador MQL. (C++ en línea:https://onlinegdb.com/H1R1fR5ML)
Presumiblemente, el problema está en el trabajo de la caché de la clase de plantilla "main_wrapper" durante la generación de código en tiempo de compilación cuando la clase interna "internal_wrapper" de la clase de plantilla "A" se pasa como parámetro para diferentes tipos de datos (int, B*, B, C).
El primer tipo de datos es creado por la clase de plantilla "main_wrapper<A<TEMPLATE_TYPE>::internal_wrapper>, dicho tipo de datos se utilizará posteriormente en todos los objetos de la plantilla en el futuro.


A continuación, se presentará otro error con la generación del código de la clase de la plantilla.

Gracias por el post, arreglado

 
Vladimir Pastushak:

El código siguiente da como resultado 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र

Se supone que la salida de la prueba de texto

Los archivos están en la carpeta Files\\Test\.

La función dice que la manija es correcta es 1 e inmediatamente GetLastError dice error 5008 Manija incorrecta ....

¿Qué debo hacer?

¿En qué codificación está el archivo?