错误、漏洞、问题 - 页 2755

 

编译器错误,在旧版本中工作正常。

struct A { };

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

struct C : B<A> { };
 

我有这样一个简单的专家顾问(见屏幕截图)。

有图表对象叠加在图表上。

在昨天的终端更新之前,交易水平显示在图表上,但现在它们消失了。

我已经按照手册中的例子 创建了图表。我没有发现任何显示交易水平的图表属性(只有基本图表有这种属性)。

请帮助。

来自MetaTrader平台的截图

英镑兑美元, M5, 2020.05.25

外汇俱乐部国际有限公司, MetaTrader 5, 真实

GBPUSD, M5, 2020.05.25, 外汇俱乐部国际有限公司, MetaTrader 5, 真实


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

你好。请帮助我理解所写的内容。

mqlrate rt [2] ;

我认为这是一个由两个结构组成的数组,自动接收相同的结构数据,这样的假设是否正确?

只是没有进一步向数组分配数据,然后立即使用数组中的数据。
 
Ivan_Invanov:

你好。请帮助我理解所写的内容。

mqlrate rt [2] ;

我认为这是一个由两个自动接收相同数据的结构组成的数组,这样的假设是否正确?

用MQL5编写。

MqlRates rt[2]

意味着:一个由两个MqlRates 结构组成的静态数组被声明。在声明之后,这些结构可能会存储胡言乱语,所以这些结构必须明确地填充数据。

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

用MQL5写作。

意味着:一个由两个MqlRates 结构组成的静态数组被声明了。 一旦声明,这些结构可以存储胡言乱语,所以这些结构需要明确地填充数据

谢谢你。
 
Alexey Navoykov:

编译器错误,在旧版本中工作正常。

是的,有这样的事情,早在 2020.03.25就有报道,已经逐日2个月 了......
(
被MT5(build 2390)修复)(new) 编译错误,当在模板类中继承时使用默认的访问修饰符,当模板参数作为基类时

 

另一个错误。

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:

还有一个bug:
1) 它抱怨C::operator=,尽管这里执行的是D::operator=。为了避免这个错误,我们必须为层次结构中的所有基类重载这个操作符。
2)总的来说,开发者很久以前就承诺要修复赋值运算符的 不正确行为,但它仍然存在--这是一种侮辱。 例如,下面的代码在编译时没有错误,尽管它赋值的是什么。

1) 考虑到MQL的特殊性,这很可能不是一个错误,而是一种自然的行为,即:
在MQL中,基类的方法和字段可以从派生类中 "直接使用"。
从本质上讲,MQL中的继承行为类似于在C++中对每个基本字段和方法使用声明。
C++在线: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中的继承行为类似于在C++中对每个基本字段和方法使用声明。
C++在线:https://onlinegdb.com/rJkckvFsU


因此,基类中的所有operator=函数在搜索适当的函数时也参与了操作d = c;

因此,重载函数调用的最佳签名是默认和远程的void operator=(const C&)。

你不必在一个明显的语言缺陷中寻找神圣的意义。 已经在这里 提出了这个问题,伊利亚斯保证会修复它。但差不多10个月已经过去了。(

从本质上讲,MQL中的继承行为与C++中使用声明的继承行为相似

是的,好吧,如果在MQL中,例如2 x 2 = 5,你可以说,这和C++中对结果添加增量操作是一样的)

 
Alexey Navoykov:

你不必在语言的明显缺陷中寻找神圣的意义。

已经向你解释了它的工作方式和原因,如果对你来说有困难--幸运的是我无法帮助...
这不是一个神圣的含义,而是一个常见的方法,为了降低用户的输入水平,使他们能够访问基类的字段和方法,而不使用 "this.",也是在重载--基类函数的情况下。