Ошибка компилятора. В старых билдах работает нормально.
Да есть такое, еще 2020.03.25 сообщал, уже день в день как 2 месяца... (не исправлено MT5(build 2390)) (new) Compile Error, при использовании модификатора доступа по умолчанию при наследовании в шаблонном классе, когда шаблонный параметр выступает базовым классом.
class A
{
voidoperator=(A const&) = delete;
};
class B : public A
{
};
class C : public B
{
};
class D : public C
{
public:
voidoperator=(A const& other) { }
};
voidOnStart()
{
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>
voidOnStart()
{
CExpert Expert;
CString String;
Expert = String; // Ошибки нет. Типа всё нормально?
}
Ещё один баг: 1) Ругается на C::operator=, хотя здесь выполняется D::operator=. Чтобы обойти баг, приходится делать перегрузку оператора для всех базовых классов в иерархии. 2) Вообще некорректное поведения оператора присваивания разработчики уже давно обещали пофиксить, но воз и ныне там. Это безобразие. Например, следующий код компилируется без ошибок, хотя там присваивается чёрти что:
1) Скорее всего не баг, а закономерное поведение учитывая особенности MQL, а именно: В MQL методи и поля базового класса "напрямую доступны" из классов наследников. По сути поведение в MQL при наследовании аналогично тому, что в С++ применить using declaration для каждого базового поля и метода. C++ online: https://onlinegdb.com/rJkckvFsU
class A
{
public:
voidoperator=(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
voidoperator=(A const& other) { printf("D");}
};
voidOnStart()
{
C c;
D d;
d = c;
}
Таким образом в операции d = c; при поиске подходящей функции так же участвуют все функции operator= из базовых классов. В результате оптимальная сигнатура для вызова перегруженной функции является дефолтный и удаленный void operator=(const C&).
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++ к результату добавить операцию инкремента )
Необязательно искать сакральный смысл в очевидной недоработке языка.
Вам объяснили как и почему так работает, если для вас это сложно - к счастью ни чем не могу помочь... Это не сакральный смысл, а обычный подход с целью снижения входного уровня пользователей, что бы они могли обращаться к полям и методам базового класса без использования "this.", а так же в случаях overloading-a функций базового класса.
Вам объяснили как и почему так работает, если для вас это сложно - к счастью ни чем не могу помочь... Это не сакральный смысл, а обычный подход с целью снижения входного уровня пользователей, что бы они могли обращаться к полям и методам базового класса без использования "this.", а так же в случаях overloading-a функций базового класса.
Вот скажите, Вам заняться больше нечем? В прошлом посте нагородили какую-то простыню, чтоб доказать непонятно что и непонятно зачем... Если считаете, что правила C++ придумывали идиоты, а вы тут самый умный - дело ваше. Я уже наглядно продемонстрировал ряд проблем, которые вызывает такое неправильное поведение оператора. И сами разработчики признали недоработку.
Здравствуйте! арендовал советника, в терминале аренда показывается, но по какой то причине я не могу его установить. Кнопка "установить" синего цвета. Надпись "Продукт арендован, но пока не загружен"
Роман Янц: Здравствуйте! арендовал советника, в терминале аренда показывается, но по какой то причине я не могу его установить. Кнопка "установить" синего цвета.
Приложите, пожалуйста скриншот вкладки "Маркет".
В терминале вкладка "Сообщество" заполнена? Internet Explorer обновили на последнюю версию? Используете настоящую Windows или запускаетесь при помощи wine?
Ошибка компилятора. В старых билдах работает нормально.
Да есть такое, еще 2020.03.25 сообщал, уже день в день как 2 месяца...
(не исправлено MT5(build 2390)) (new) Compile Error, при использовании модификатора доступа по умолчанию при наследовании в шаблонном классе, когда шаблонный параметр выступает базовым классом.
Ещё один баг:
Ругается на C::operator=, хотя здесь выполняется D::operator=. Чтобы обойти баг, приходится делать перегрузку оператора для всех базовых классов в иерархии.
p.s. Вообще некорректное поведения оператора присваивания разработчики уже давно обещали пофиксить, но воз и ныне там. Это безобразие. Например, следующий код компилируется без ошибок, хотя там присваивается чёрти что:
Ещё один баг:
1) Ругается на C::operator=, хотя здесь выполняется D::operator=. Чтобы обойти баг, приходится делать перегрузку оператора для всех базовых классов в иерархии.
2) Вообще некорректное поведения оператора присваивания разработчики уже давно обещали пофиксить, но воз и ныне там. Это безобразие. Например, следующий код компилируется без ошибок, хотя там присваивается чёрти что:
1) Скорее всего не баг, а закономерное поведение учитывая особенности MQL, а именно:
В MQL методи и поля базового класса "напрямую доступны" из классов наследников.
По сути поведение в MQL при наследовании аналогично тому, что в С++ применить using declaration для каждого базового поля и метода.
C++ online: https://onlinegdb.com/rJkckvFsU
Таким образом в операции d = c;
при поиске подходящей функции так же участвуют все функции operator= из базовых классов.
В результате оптимальная сигнатура для вызова перегруженной функции является дефолтный и удаленный void operator=(const C&).
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++ к результату добавить операцию инкремента )
Необязательно искать сакральный смысл в очевидной недоработке языка.
Вам объяснили как и почему так работает, если для вас это сложно - к счастью ни чем не могу помочь...
Это не сакральный смысл, а обычный подход с целью снижения входного уровня пользователей, что бы они могли обращаться к полям и методам базового класса без использования "this.", а так же в случаях overloading-a функций базового класса.
Вам объяснили как и почему так работает, если для вас это сложно - к счастью ни чем не могу помочь...
Это не сакральный смысл, а обычный подход с целью снижения входного уровня пользователей, что бы они могли обращаться к полям и методам базового класса без использования "this.", а так же в случаях overloading-a функций базового класса.
Здравствуйте! арендовал советника, в терминале аренда показывается, но по какой то причине я не могу его установить. Кнопка "установить" синего цвета.
Приложите, пожалуйста скриншот вкладки "Маркет".
В терминале вкладка "Сообщество" заполнена? Internet Explorer обновили на последнюю версию? Используете настоящую Windows или запускаетесь при помощи wine?