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

Alexey Navoykov
4679
Alexey Navoykov  

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

struct A { };

template<typename T> 
struct B : T { };  // 'A' - unexpected token

struct C : B<A> { };
Mesaoria
178
Mesaoria  

У меня есть такой простой эксперт (см. скриншот).

На график наложены объекты Chart.

До вчерашнего обновления терминала на чартах показывались торговые уровни, но сейчас исчезли.

Чарты создаю как указано в примере из мануала. Там нет свойств для отображения торговых уровней (такое свойство существует только для основных графиков).

Помогите, пожалуйста.

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_CHART
  • www.mql5.com
//| Создает объект "График"                                          |               chart_ID=0,                               sub_window=0,                             x=0,                                      y=0,                                      width=300,                                height=200,               ...
Ivan_Invanov
7
Ivan_Invanov  

Привет. Помогите пожалуйста разобраться, что написано.

mqlrate rt [2] ;

Правильно ли я понимаю, что это массив из двух структур которые автоматически получил одинаковые данные структуры? 

Просто дальше нет присвоения массиву данных, а потом из массива используются сразу данные.
Vladimir Karputov
Модератор
192915
Vladimir Karputov  
Ivan_Invanov:

Привет. Помогите пожалуйста разобраться, что написано.

mqlrate rt [2] ;

Правильно ли я понимаю, что это массив из двух структур которые автоматически получили одинаковые данные? 

Запись на MQL5:

MqlRates rt[2]

означает: объявлен статический массив из двух структур MqlRates . После объявления в этих структурах может храниться белиберда, поэтому эти структуры необходимо явно заполнить данными.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура исторических данных
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура исторических данных
  • www.mql5.com
Константы, перечисления и структуры / Структуры данных / Структура исторических данных - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Ivan_Invanov
7
Ivan_Invanov  
Vladimir Karputov:

Запись на MQL5:

означает: объявлен статический массив из двух структур MqlRates. После объявления в этих структурах может храниться белиберда, поэтому эти структуры необходимо явно заполнить данными.

Спасибо.
Sergey Dzyublik
4532
Sergey Dzyublik  
Alexey Navoykov:

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

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

Alexey Navoykov
4679
Alexey Navoykov  

Ещё один баг:

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; // Ошибки нет. Типа всё нормально?
}
Sergey Dzyublik
4532
Sergey Dzyublik  
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&).

Alexey Navoykov
4679
Alexey Navoykov  
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++ к результату добавить операцию инкремента )

Sergey Dzyublik
4532
Sergey Dzyublik  
Alexey Navoykov:

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

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