Ошибки, баги, вопросы - страница 2674

 

Напомните, пожалуйста, существует ли изящный способ разрешения ошибки "ambiguous call to overloaded function", когда нужна отдельная обработка для простых типов и указателей, вроде такого:

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

    void process(BaseFunctor *ptr)
    {
    }

Здесь компилятор считает, что (BaseFunctor *) тоже соответствует V. Можно явно указывать приведение типа при вызове метода, но это некрасиво. Если в шаблонной функции принимать параметр по ссылке, то нельзя будет передавать константы и прочие временные значения (требуется переменная).

 
Stanislav Korotky:
попробуй добавить перегрузку со ссылкой
 
TheXpert:
попробуй добавить перегрузку со ссылкой

Имеется в виду перегрузка со ссылкой на объекты или ссылка на указатель (чего вроде не существует)? Я не в курсе, как в ссылку на объект подсунуть указатель на распределенный по new экземпляр.

 
Artyom Trishkin:

У вас цикл не правильный для закрытия позиций. Сделайте обратный цикл.

Artyom Trishkin:

У вас цикл не правильный для закрытия позиций. Сделайте обратный цикл.

Попробую, но разве не всё равно как перебирать, если мы ищем все профитные позы одного направления. Мы же в любом случае переберём всё и закроем нужные.

 
Stanislav Korotky:

Имеется в виду перегрузка со ссылкой на объекты или ссылка на указатель (чего вроде не существует)? Я не в курсе, как в ссылку на объект подсунуть указатель на распределенный по new экземпляр.

со ссылкой на объекты.

у меня так:

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:

со ссылкой на объекты.

у меня так:

Всё же не настолько прямолинейно, извиняйте ;-). Класс используется для наследования:

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

Если б можно было создавать BaseFunctor, он бы работал, да. Но это не тот случай.

 
Pavel Kozlov:

Здравствуйте!

Спасибо за сообщение об ошибке!

Не могли бы вы подробнее описать проблему с картинкой?

На текущий момент проблемы нет

 

Код ниже выводит 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र

А должен вывести текст test

Файлы лежат в папке Files\\Test\\

Функция пишет что хендл верен он равен 1 и сразу GetLastError пишет ошибку 5008 Не верный хендл ....

Куда копать ?

//+------------------------------------------------------------------+
//| 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:
Очень противный баг MT5(build 2316), блокирующий дальнейшую разработку.
Создаешь сложный несколько раз обернутый объект с внутренним типом "С", а там оказывается совсем другой тип данных, может "B", может "int", что хочешь...

Убил уйму времени и сил, что бы раскопать и понять, что проблема не в коде, а в работе MQL компилятора. (С++ online: https://onlinegdb.com/H1R1fR5ML)
Предположительно, проблема в работе кеша шаблонного класса "main_wrapper" при генерации кода во время компиляции, когда в качестве параметра передается internal class "internal_wrapper" от шаблонного класса "A" для различных типов данных (int, B*, B, C).
Какой первый тип данных будет создан шаблонным классом "main_wrapper<A<TEMPLATE_TYPE>::internal_wrapper>, такой тип данных и будет далее использоваться во всех объектах, данного шаблона в будущем.


Другой баг с генераций кода шаблонного класса будет предоставлен ниже.

Спасибо за сообщение, исправлено

 
Vladimir Pastushak:

Код ниже выводит 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र

А должен вывести текст test

Файлы лежат в папке Files\\Test\\

Функция пишет что хендл верен он равен 1 и сразу GetLastError пишет ошибку 5008 Не верный хендл ....

Куда копать ?

В какой кодировке файл?

Причина обращения: