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

 
Alexey Navoykov:

Ошибка компилятора.  В старых билдах работает нормально.

Да есть такое, еще   2020.03.25  сообщал, уже день в день как 2 месяца...
(не исправлено MT5(build 2390))     (new)   Compile Error, при использовании модификатора доступа по умолчанию при наследовании в шаблонном классе, когда шаблонный параметр выступает базовым классом.

 

Ещё один баг:

class A
{
  void operator=(A const&) = delete;
};

class B : public A
{
};

class C : public B
{
};

class D : public C
{
 public:
  void operator=(A const& other) { }
};

void OnStart()
{
  C c;
  D d;
  d = c; // attempting to reference deleted function 'void C::operator=(const C&)'
}

Ругается на C::operator=, хотя здесь выполняется D::operator=.   Чтобы обойти баг, приходится делать перегрузку оператора для всех базовых классов в иерархии.


p.s.  Вообще некорректное поведения оператора присваивания разработчики уже давно обещали пофиксить, но воз и ныне там.  Это безобразие.  Например, следующий код компилируется без ошибок, хотя там присваивается чёрти что:

#include <Expert\Expert.mqh>

#include <Strings\String.mqh>

void OnStart()
{
  CExpert Expert;
  CString String;
  Expert = String; // Ошибки нет. Типа всё нормально?
}
 
Alexey Navoykov:

Ещё один баг:
1) Ругается на C::operator=, хотя здесь выполняется D::operator=.   Чтобы обойти баг, приходится делать перегрузку оператора для всех базовых классов в иерархии.
2) Вообще некорректное поведения оператора присваивания разработчики уже давно обещали пофиксить, но воз и ныне там.  Это безобразие.  Например, следующий код компилируется без ошибок, хотя там присваивается чёрти что:

1) Скорее всего не баг, а закономерное поведение учитывая особенности MQL, а именно:
В MQL методи и поля базового класса "напрямую доступны" из классов наследников.
По сути поведение в MQL при наследовании аналогично тому, что в С++ применить using declaration для каждого базового поля и метода.
C++ online: https://onlinegdb.com/rJkckvFsU

class A
{
public:
  void operator=(A const&) = delete;
};

class B : public A
{
};

class C : public B
{
public:
    //void operator=(C const& other) { printf("C");}
};

class D : public C
{
public:
#ifdef __cplusplus
  using A::operator=;
  using B::operator=;
  using C::operator=;
#endif
  void operator=(A const& other) { printf("D");}
};

void OnStart()
{
  C c;
  D d;
  d = c; 
}



Таким образом в операции d = c;
при поиске подходящей функции так же участвуют все функции operator= из базовых классов.
В результате оптимальная сигнатура для вызова перегруженной функции является дефолтный и удаленный void operator=(const C&).

 
Sergey Dzyublik:

1) Скорее всего не баг, а закономерное поведение учитывая особенности MQL, а именно:
В MQL методи и поля базового класса "напрямую доступны" из классов наследников.
По сути поведение в MQL при наследовании аналогично тому, что в С++ применить using declaration для каждого базового поля и метода.
C++ online: https://onlinegdb.com/rJkckvFsU


Таким образом в операции d = c;
при поиске подходящей функции так же участвуют все функции operator= из базовых классов.
В результате оптимальная сигнатура для вызова перегруженной функции является дефолтный и удаленный void operator=(const C&).

Необязательно искать сакральный смысл в очевидной недоработке языка.  Вот здесь я уже поднимал данную проблему, и Ильяс заверил, что это будет исправлено.   Но уже почти 10 месяцев пролетело... (

По сути поведение в MQL при наследовании аналогично тому, что в С++ применить using declaration

Ну да, а если бы в MQL допустим было  2 x 2 = 5,  то можно было сказать, что это аналогично тому, как если в C++ к результату добавить операцию инкремента )

 
Alexey Navoykov:

Необязательно искать сакральный смысл в очевидной недоработке языка. 

Вам объяснили как и почему так работает, если для вас это сложно - к счастью ни чем не могу помочь...
Это не сакральный смысл, а обычный подход с целью снижения входного уровня пользователей, что бы они могли обращаться к полям и методам базового класса без использования "this.", а так же в случаях overloading-a функций базового класса.

 
Sergey Dzyublik:

Вам объяснили как и почему так работает, если для вас это сложно - к счастью ни чем не могу помочь...
Это не сакральный смысл, а обычный подход с целью снижения входного уровня пользователей, что бы они могли обращаться к полям и методам базового класса без использования "this.", а так же в случаях overloading-a функций базового класса.

Вот скажите, Вам заняться больше нечем?  В прошлом посте нагородили какую-то простыню, чтоб доказать непонятно что и непонятно зачем...  Если считаете, что правила C++ придумывали идиоты, а вы тут самый умный - дело ваше.  Я уже наглядно продемонстрировал ряд проблем, которые вызывает такое неправильное поведение оператора.  И сами разработчики признали недоработку.
 
Комментарии, не относящиеся к этой теме, были перенесены в "Закрытие программы".
 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
 
Здравствуйте! арендовал советника, в терминале аренда показывается, но по какой то причине я не могу его установить. Кнопка "установить" синего цвета. Надпись "Продукт арендован, но пока не загружен"
 
Роман Янц:
Здравствуйте! арендовал советника, в терминале аренда показывается, но по какой то причине я не могу его установить. Кнопка "установить" синего цвета.

Приложите, пожалуйста скриншот вкладки "Маркет".

В терминале вкладка "Сообщество" заполнена? Internet Explorer обновили на последнюю версию? Используете настоящую Windows или запускаетесь при помощи wine?