Константы, перечисления и структуры / Структуры данных / Структура исторических данных - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
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&)'
}
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;
}
编译器错误,在旧版本中工作正常。
我有这样一个简单的专家顾问(见屏幕截图)。
有图表对象叠加在图表上。
在昨天的终端更新之前,交易水平显示在图表上,但现在它们消失了。
我已经按照手册中的例子 创建了图表。我没有发现任何显示交易水平的图表属性(只有基本图表有这种属性)。
请帮助。
来自MetaTrader平台的截图
英镑兑美元, M5, 2020.05.25
外汇俱乐部国际有限公司, MetaTrader 5, 真实
你好。请帮助我理解所写的内容。
mqlrate rt [2] ;
我认为这是一个由两个结构组成的数组,自动接收相同的结构数据,这样的假设是否正确?
只是没有进一步向数组分配数据,然后立即使用数组中的数据。你好。请帮助我理解所写的内容。
mqlrate rt [2] ;
我认为这是一个由两个自动接收相同数据的结构组成的数组,这样的假设是否正确?
用MQL5编写。
意味着:一个由两个MqlRates 结构组成的静态数组被声明。在声明之后,这些结构可能会存储胡言乱语,所以这些结构必须明确地填充数据。
用MQL5写作。
意味着:一个由两个MqlRates 结构组成的静态数组被声明了。 一旦声明,这些结构可以存储胡言乱语,所以这些结构需要明确地填充数据。
编译器错误,在旧版本中工作正常。
是的,有这样的事情,早在 2020.03.25就有报道,已经逐日2个月 了......
(未被MT5(build 2390)修复)(new) 编译错误,当在模板类中继承时使用默认的访问修饰符,当模板参数作为基类时。
另一个错误。
C::operator=,尽管D::operator=在这里被执行。为了解决这个问题,你必须为层次结构中的所有基类重载该操作符。
p.s.总的来说,开发者很久以前就承诺要修复不正确的赋值运算符 行为,但它仍然存在。 这是一种愤怒。 例如,下面的代码在编译时没有错误,尽管它正在赋值。
还有一个bug:
1) 它抱怨C::operator=,尽管这里执行的是D::operator=。为了避免这个错误,我们必须为层次结构中的所有基类重载这个操作符。
2)总的来说,开发者很久以前就承诺要修复赋值运算符的 不正确行为,但它仍然存在--这是一种侮辱。 例如,下面的代码在编译时没有错误,尽管它赋值的是什么。
1) 考虑到MQL的特殊性,这很可能不是一个错误,而是一种自然的行为,即:
在MQL中,基类的方法和字段可以从派生类中 "直接使用"。
从本质上讲,MQL中的继承行为类似于在C++中对每个基本字段和方法使用声明。
C++在线:https://onlinegdb.com/rJkckvFsU
因此,在搜索适当的函数时,操作d = c;
也涉及基类的所有operator=函数。
因此,重载函数调用的最佳签名是默认的和删除的void operator=(const C&)。
1) 最有可能的是,这不是一个错误,而是考虑到MQL的特殊性的自然行为,即:
在MQL中,基类的方法和字段可以从子类中 "直接获得"。
从本质上讲,MQL中的继承行为类似于在C++中对每个基本字段和方法使用声明。
C++在线:https://onlinegdb.com/rJkckvFsU
因此,基类中的所有operator=函数在搜索适当的函数时也参与了操作d = c;
。
因此,重载函数调用的最佳签名是默认和远程的void operator=(const C&)。
你不必在一个明显的语言缺陷中寻找神圣的意义。我 已经在这里 提出了这个问题,伊利亚斯保证会修复它。但差不多10个月已经过去了。(
从本质上讲,MQL中的继承行为与C++中使用声明的继承行为相似
是的,好吧,如果在MQL中,例如2 x 2 = 5,你可以说,这和C++中对结果添加增量操作是一样的)
你不必在语言的明显缺陷中寻找神圣的意义。
已经向你解释了它的工作方式和原因,如果对你来说有困难--幸运的是我无法帮助...
这不是一个神圣的含义,而是一个常见的方法,为了降低用户的输入水平,使他们能够访问基类的字段和方法,而不使用 "this.",也是在重载--基类函数的情况下。