Errori, bug, domande - pagina 2674

 

Per favore, ricordatemi se c'è un modo pulito per risolvere l'errore "ambiguous call to overloaded function" quando avete bisogno di una gestione separata per tipi semplici e puntatori, come questo:

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

    void process(BaseFunctor *ptr)
    {
    }

Qui il compilatore considera che (BaseFunctor *) corrisponde anche a V. Si può specificare esplicitamente la conversione di tipo quando si chiama un metodo, ma è brutto. Se prendete un parametro per riferimento in una funzione template, non potete passare costanti e altri valori temporanei (è necessaria una variabile).

 
Stanislav Korotky:
prova ad aggiungere un sovraccarico con un link
 
TheXpert:
prova ad aggiungere un sovraccarico con un riferimento

Intendi il sovraccarico del riferimento all'oggetto o il riferimento al puntatore (che non sembra esistere)? Non so come infilare un puntatore a una nuova istanza distribuita in un riferimento a un oggetto.

 
Artyom Trishkin:

Il vostro ciclo non è corretto per le posizioni di chiusura. Fare un ciclo inverso.

Artyom Trishkin:

Il vostro ciclo non è corretto per le posizioni di chiusura. Fare un ciclo inverso.

Ci proverò, ma non importa come fare il loop se stiamo cercando tutte le posizioni redditizie della stessa direzione. Li esamineremo comunque tutti e chiuderemo quelli necessari.

 
Stanislav Korotky:

Intendi il sovraccarico con riferimento all'oggetto o al puntatore (che non sembra esistere)? Non so come infilare un puntatore a un'istanza distribuita in un riferimento a un oggetto.

Con un riferimento ad un oggetto.

Io ce l'ho così:

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 riferimento agli oggetti.

Io ce l'ho così:

Non è ancora così semplice, mi dispiace ;-). La classe è usata per l'ereditarietà:

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

Se si potesse creare un BaseFunctor, funzionerebbe, sì. Ma non è questo il caso.

 
Pavel Kozlov:

Ciao!

Grazie per aver segnalato l'errore!

Potresti elaborare il problema con l'immagine?

Nessun problema al momento

 

Il codice qui sotto produce 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र

Dovrebbe emettere il test del testo

I file sono nella cartella Files\Test\.

La funzione dice che l'handle è corretto è 1 e immediatamente GetLastError dice errore 5008 Wrong handle ....

Cosa devo fare?

//+------------------------------------------------------------------+
//| 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:
Bug molto brutto di MT5 (build 2316) che blocca l'ulteriore sviluppo.
Si crea più volte un oggetto complesso avvolto con il tipo interno "C", ma si scopre che è un tipo di dati completamente diverso, forse "B", "int", qualsiasi cosa si voglia...

Ho speso molto tempo e fatica per trovare e capire che il problema non è nel codice ma nel compilatore MQL. (C++ online:https://onlinegdb.com/H1R1fR5ML)
Presumibilmente, il problema è nel lavoro della cache della classe template "main_wrapper" durante la generazione del codice al momento della compilazione quando la classe interna "internal_wrapper" dalla classe template "A" viene passata come parametro per diversi tipi di dati (int, B*, B, C).
Quale primo tipo di dati è creato dalla classe template "main_wrapper<A<TEMPLATE_TYPE>::internal_wrapper>, tale tipo di dati sarà ulteriormente usato in tutti gli oggetti del template in futuro.


Un altro bug con la generazione del codice della classe del modello sarà fornito di seguito.

Grazie per il post, risolto

 
Vladimir Pastushak:

Il codice qui sotto produce 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र

Dovrebbe emettere il test del testo

I file sono nella cartella Files\Test\.

La funzione dice che l'handle è corretto è 1 e immediatamente GetLastError dice errore 5008 Wrong handle ....

Cosa devo fare?

In quale codifica è il file?