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

 
Igor Zakharev #:

Скринкаст прилагаю. Все три хэндла одинаковым номером инициализировались, что считается за баг. В результате три индикатора как 1 видит.

На видео нет значения MA_differential. Если оно нулевое, то правильно все работает.
 
fxsaber #:
На видео нет значения MA_differential. Если оно нулевое, то правильно все работает.

Окей.

Уже переустановил и всё перезапустил.

P. S. Решил переделать iMA в кастомный и добавить ему еще параметр в поинтах для вертикальной оси.

 
fvdtrejder #:
И после этого МТ 4 запустить не получается. Может кто знает как исправить этот параметр на прежний ,не устанавливая заново МТ 4?

удалить/переименовать файл

"C:\Program Files (x86)\XXXX MT4 Terminal\config\charts.ini"

 
trader6_1 #:

удалить/переименовать файл

"C:\Program Files (x86)\XXXX MT4 Terminal\config\charts.ini"

Может terminal.ini?

А в принципе, можно и всю папку config
 
Просьба объяснить логику такого поведения компилятора.
struct A
{
  const int Tmp;

//  void operator =( const A& ) {}
};

void OnStart()
{
  A a1 = {7};
  Print(a1.Tmp);

  // attempting to reference deleted function 'void A::operator=(const A&)
  //   function 'void A::operator=(const A&)' was implicitly deleted because member 'Tmp' has 'const' modifier
  A a2 = a1;  
  Print(a2.Tmp);
}

Зачем ему требуется удалять штатный оператор присваивания при наличии const-полей?


ЗЫ Поиск выдал упоминание только в книге. Но там нет пояснения.

Учебник по MQL5: Объектно-Ориентированное Программирование / Классы и интерфейсы / Конструкторы: по умолчанию, параметрический, копирования
Учебник по MQL5: Объектно-Ориентированное Программирование / Классы и интерфейсы / Конструкторы: по умолчанию, параметрический, копирования
  • www.mql5.com
Мы уже сталкивались с конструкторами в главе, посвященной структурам (см. раздел Конструкторы и деструкторы ). Для классов они работают, во многом...
 
fxsaber #:
Просьба объяснить логику такого поведения компилятора.

Зачем ему требуется удалять штатный оператор присваивания при наличии const-полей?

ЗЫ Поиск выдал упоминание только в книге. Но там нет пояснения.

Есть кое-что немного похожее в документации.

https://www.mql5.com/ru/docs/basis/types/classes#class

class A
  {
protected:
   //--- оператор копирования доступен только внутри класса A и его наследников
   void operator=(const A &)
     {
     }
  };
class B
  {
   //--- обьявлен объект класса A
   A                 a;
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   //--- объявим две переменные типа B
   B b1, b2;
   //--- попытка скопировать один объект в другой
   b2=b1;
  }

При компиляции этого кода будет получено сообщение об ошибке — попытка вызвать удаленный оператор копирования:

attempting to reference deleted function 'void B::operator=(const B&)'   trash3.mq5   32   6

И второй строкой ниже дается более подробное описание — оператор копирования в классе B был явно удален, так как вызывается недоступный оператор копирования класса A:

function 'void B::operator=(const B&)' was implicitly deleted because it invokes inaccessible function 'void A::operator=(const A&)'

Можно трактовать так, что компилятор удалил оператор копирования для класса B, так как нет возможности скопировать объект класса A, который является членом класса B. В этом я вижу аналогию с вашим примером - там нет возможности скопировать Tmp, так как он константный.

Но это просто мои догадки, я не уверен, что они в правильную сторону хотя бы.

 
Vladislav Boyko #:

Можно трактовать так, что компилятор удалил оператор копирования для класса B, так как нет возможности скопировать объект класса A, который является членом класса B. В этом я вижу аналогию с вашим примером - там нет возможности скопировать Tmp, так как он константный.

Спасибо, логично.
 
fxsaber # :
Просьба объяснить логику такого поведения компилятора.

Зачем ему требуется удалять штатный оператор присваивания при наличии const-полей?


ЗЫ Поиск выдал упоминание только в книге . Но там нет пояснения.

Это ошибка компилятора. Не следует использовать присваивание (operator=), а следует использовать конструктор Copy.
 
Vladislav Boyko # :

Есть кое-что немного похожее в документации.

Можно трактовать так, что компилятор удалил оператор копирования для класса B, так как нет возможности скопировать объект класса A, который является членом класса B. В этом я вижу аналогию с вашим примером - там нет возможности скопировать Tmp, так как он константный.

Но это просто мои догадки, я не уверен, что они в правильную сторону хотя бы.

Не то же самое. Там ошибка ожидаема, так как это присваивание, и, кроме того, в A определен явный 'operator='.
 
Alain Verleyen #:
а следует использовать конструктор Copy

Если определен явный конструктор копирования, то он будет вызван

struct A
{
  const int Tmp;
  A(const A& x) : Tmp(x.Tmp) {}
  A(int x) : Tmp(x) {}
};

void OnStart()
{
  //A a1 = {7}; // 'a1' - cannot be initialized with initializer list
  A a1(7);
  Print(a1.Tmp);
  A a2 = a1; // OK
  Print(a2.Tmp);
}

Я не знаю, следует ли компилятору генерировать неявный конструктор копирования в таком случае. Я не программирую на C++, поэтому я не знаю, какое поведения компилятора считается правильным.

Alain Verleyen #:
Не то же самое. Там ошибка ожидаема, так как это присваивание, и, кроме того, в A определен явный 'operator='.

Да, вы правы, я не заметил, что там присваивание, а не инициализация.