Новая версия платформы MetaTrader 5 build 3091: Улучшения в работе - страница 22

 
fxsaber #:

Хронология нашего диалога не имеет никакого отношения к наличию ошибки.

А что Вам мешало сразу этот конкретный пример привести?

Здесь вызывается ::f(), а в чем ошибка? В предупреждении? Оно говорит лишь о том, что в будущем порядок будет изменен. А будет ли в будущем (вместо предупреждения) ошибка или нет - здесь заранее сказать нельзя - зависит от того как Разработчики реализуют. Соответственно предупреждение в любом случае полезно, что не попасть в просак

 
A100 #:

А что Вам мешало сразу этот конкретный пример привести?

Он и был приведен. Дальнейшая реакция мне непонятна.

Здесь вызывается ::f(), а в чем ошибка? В предупреждении? Оно говорит лишь о том, что в будущем порядок будет изменен. А будет ли в будущем (вместо предупреждения) ошибка или нет - здесь заранее сказать нельзя - зависит от того как Разработчики реализуют. Соответственно предупреждение в любом случае полезно, что не попасть в просак

Все. Сожрали мое время.

 
fxsaber #:

Он и был приведен. Дальнейшая реакция мне непонятна.

Все. Сожрали мое время.

Там похожий код, но другой

Warning не ошибочна - и я объяснил почему

 
Добрый день! Можно ли сделать так, чтобы стакан был поверх всех окон?
 
A100 #:

А что Вам мешало сразу этот конкретный пример привести?

Здесь вызывается ::f(), а в чем ошибка? В предупреждении? Оно говорит лишь о том, что в будущем порядок будет изменен. А будет ли в будущем (вместо предупреждения) ошибка или нет - здесь заранее сказать нельзя - зависит от того как Разработчики реализуют. Соответственно предупреждение в любом случае полезно, что не попасть в просак

Мы планируем устранить родовую ошибку MQL компилятора, при объявлении фукнции внутри скопа, она должна переопределять (не путать с перегрузкой)  "внешние" для данного скопа функции с такими же именами (например глобальные или по наследованию)

Сразу отключать не стали, пока выдаём предупреждение.

Родовая ошибка была осознанной, т.к. в MQL не было полноценной поддержки скопов, которую мы почти полностью реализовали в последних версиях компилятора.

 
Ilyas #:

Мы планируем устранить родовую ошибку MQL компилятора

Просьба показать на простом примере, каким будет планируемое поведение.

 
fxsaber #:

Просьба показать на простом примере, каким будет планируемое поведение.

Из простого:

struct A
  {
   int x;

   void func(int,int)
     {
     }
  };

struct B : A
  {
   void func(int)
     {
     }
  };

void OnStart(void)
  {
   B b;
   b.func(10,10);      // будет ошибка, в B нет функции func с двумя параметрами, она скрыта func с одним параметром
   b.A::func(10,10);   // OK, в A такая функция имеется
  }


А вот пример кода, за который мы переживаем

struct A
  {
   int x;
   
   void func(int)
     {
      printf("%s",__FUNCSIG__);
     }
  };

struct B : A
  {
   void func(double)
     {
      printf("%s",__FUNCSIG__);
     }
  };

void OnStart(void)
  {
   B b;
   b.func((int)1);     // !! будет вызвана B::func(double)
   b.A::func((int)1);  //ОК, вызов A::func(int)


  }

На первое время будем проверять наличие более точной по параметрам функции во "внешем" скопе, если обнаружится то будет предупреждение и совет, как его обойти.

 
Ilyas #:

На первое время будем проверять наличие более точной по параметрам функции во "внешем" скопе, если обнаружится то будет предупреждение и совет, как его обойти.

Спасибо, понятно. Этот код будет выдавать ошибку "'1' - parameter passed as reference, variable expected", потому что ::f(...) будет невидима для вызова f(...)?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 3091: Улучшения в работе

fxsaber, 2021.11.17 11:10

void f( const int )  {}

class A
{
  static void f( const int& ) {}

  static void Func( void )
  {    
    // По сигнатурам очевидно, что A::f не может быть вызван, т.к. передача не по ссылке. Поэтому предупреждение ошибочное.
    f(1); // WARNING: deprecated behavior, hidden method calling will be disabled in a future MQL compiler version
  }
};
 
fxsaber #:

Спасибо, понятно. Этот код будет выдавать ошибку "'1' - parameter passed as reference, variable expected", потому что ::f(...) будет невидима для вызова f(...)?

Да, этот код будет выдавать ошибку компиляции и первое время (пока не определили сколько) будем давать совет:

"Возможно вы забыли указать '::' перед именем функции"

 
Ilyas #:

при объявлении фукнции внутри скопа, она должна переопределять (не путать с перегрузкой)  "внешние" для данного скопа функции с такими же именами (например глобальные или по наследованию)

Это уточнение убрало все неоднозначности в понимании.

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