Erros, bugs, perguntas - página 2674

 

Por favor, lembre-me se existe uma forma clara de resolver o erro de "chamada ambígua para função sobrecarregada" quando necessita de manipulação separada para tipos e indicações simples, como esta:

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

    void process(BaseFunctor *ptr)
    {
    }

Aqui o compilador considera que (BaseFunctor *) também corresponde a V. É possível especificar explicitamente a conversão do tipo quando se chama um método, mas é feio. Se tomar um parâmetro por referência numa função de modelo, não pode passar constantes e outros valores temporários (é necessária uma variável).

 
Stanislav Korotky:
tente adicionar uma sobrecarga com uma ligação
 
TheXpert:
tente adicionar uma sobrecarga com uma referência

Refere-se à sobrecarga com referência de objecto ou referência de ponteiro (que parece não existir)? Não sei como passar um ponteiro para uma nova instância distribuída para uma referência de objecto.

 
Artyom Trishkin:

O seu ciclo não é correcto para posições de fecho. Fazer um ciclo inverso.

Artyom Trishkin:

O seu ciclo não é correcto para posições de fecho. Fazer um ciclo inverso.

Tentarei, mas não importa como fazer um loop se estamos à procura de todas as posições lucrativas da mesma direcção. Passaremos por todas elas de qualquer forma e fecharemos as necessárias.

 
Stanislav Korotky:

Refere-se à sobrecarga com referência de objecto ou referência de ponteiro (que parece não existir)? Não sei como passar um ponteiro para uma instância distribuída para uma referência de objecto.

Com uma referência de objecto.

Tenho-o assim:

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:

com referência a objectos.

Tenho-o assim:

Ainda não tão simples, desculpe ;-). A classe é utilizada para herança:

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 pudesse criar um BaseFunctor, ele funcionaria, sim. Mas não é esse o caso.

 
Pavel Kozlov:

Olá!

Obrigado por comunicar o erro!

Poderia por favor desenvolver o problema com a imagem?

Sem problemas de momento

 

O código abaixo sai 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र

É suposto produzir o teste de texto

Os ficheiros estão na pasta Files Test.

A função diz que o cabo está correcto é 1 e imediatamente GetLastError diz erro 5008 Cabo errado ....

O que devo fazer?

//+------------------------------------------------------------------+
//| 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 MT5(build 2316) muito desagradável, bloqueando um maior desenvolvimento.
Cria-se várias vezes um objecto complexo embrulhado com tipo interno "C", mas acaba por ser um tipo de dados bastante diferente, talvez "B", "int", o que se quiser...

Demorei muito tempo e esforço para encontrar e compreender que o problema não está no código mas sim no compilador MQL. (C++ online:https://onlinegdb.com/H1R1fR5ML)
Presumivelmente, o problema está no trabalho da cache da classe template "main_wrapper" durante a geração do código no momento da compilação, quando a classe interna "internal_wrapper" da classe template "A" é passada como parâmetro para diferentes tipos de dados (int, B*, B, C).
Que primeiro tipo de dados é criado pela classe de modelo "main_wrapper<A<TEMPLATE_TYPE>::internal_wrapper>, tal tipo de dados será mais tarde utilizado em todos os objectos do modelo no futuro.


Um outro bug com a geração do código da classe modelo será fornecido abaixo.

Obrigado pelo correio, fixado

 
Vladimir Pastushak:

O código abaixo sai 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र

É suposto produzir o teste de texto

Os ficheiros estão na pasta Files Test.

A função diz que o cabo está correcto é 1 e imediatamente GetLastError diz erro 5008 Cabo errado ....

O que devo fazer?

Em que codificação está o ficheiro?