エラー、バグ、質問 - ページ 2755

 

コンパイラーエラーです。 古いビルドでは問題なく動作します。

struct A { };

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

struct C : B<A> { };
 

私はこのようなシンプルなExpert Advisorを持っています(スクリーンショット参照)。

チャートの上にChartオブジェクトが重なっています。

昨日の端末更新前は取引水準がチャートに表示されていましたが、現在は消えています。

マニュアルにある例の ようにチャートを作成しました。トレードレベルを表示するためのチャートプロパティが見当たりません(ベーシックチャートのみそのようなプロパティがあります)。

よろしくお願いします。

MetaTrader プラットフォームのスクリーンショット

GBPUSD、M5、2020.05.25

フォレックス・クラブ・インターナショナル・リミテッド, MetaTrader 5, Real

GBPUSD, M5, 2020.05.25, フォレックスクラブインターナショナルリミテッド, MetaTrader 5, Real


Документация по 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] ;

これは、自動的に同じ構造体データを受け取った2つの構造体の配列ということでよろしいでしょうか?

たださらに、配列へのデータの割り当てがなく、配列のデータを一度に使用することになります。
 
Ivan_Invanov:

こんにちは。書かれていることを理解するために、ご協力をお願いします。

mqlrate rt [2] ;

これは、自動的に同じデータを受信した2つの構造体の配列ということでよろしいのでしょうか?

MQL5で書かれています。

MqlRates rt[2]

というのは、2つのMqlRates 構造体の静的配列が宣言されていることを意味します。宣言後、これらの構造体にはちんぷんかんぷんなデータが格納される可能性があるため、これらの構造体には明示的にデータを入れる必要があります。

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

MQL5で書く。

意味:2つの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&)'
}

ここではD::operator=が実行されていますが、C::operator=のせいにしています。このバグを回避するためには、階層内のすべての基底クラスに対して演算子をオーバーロードする必要があります。


p.s. 一般に、開発者はずっと前に不正な代入演算子の 動作を修正すると約束しましたが、まだ残っています。 これは言語道断です。 たとえば、次のコードは、一体何を代入しているのかわかりませんが、エラーなしでコンパイルできます。

#include <Expert\Expert.mqh>

#include <Strings\String.mqh>

void OnStart()
{
  CExpert Expert;
  CString String;
  Expert = String; // Ошибки нет. Типа всё нормально?
}
 
Alexey Navoykov:

もう一つバグがあります。
1) ここでD::operator=が実行されているのに、C::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:


MQLでは、ベースクラスのメソッドやフィールドは、子孫クラスから「直接」利用することができます。
要するに、MQLにおける継承の動作は、C++で基本的なフィールドやメソッドごとに宣言を使用するのと似ています。
C++オンライン: https://onlinegdb.com/rJkckvFsU


したがって、ベースクラスのすべてのoperator=関数は、適切な関数を検索するときに、d = c;
の操作にも関与する。
その結果、オーバーロードされた関数呼び出しの最適なシグネチャは、デフォルトでリモートなvoid operator=(const C&)となります。

明らかな言語的欠陥に神聖な意味を求める必要はありません。私は すでにこの問題をここで 提起し、イリヤスはそれが修正されることを保証しました。しかし、すでに10カ月近くが経過しています。(

本質的に、MQLにおける継承の動作は、宣言を使用するC++の動作と似ています。

そうですね、例えばMQLで2×2=5とすると、C++で結果にインクリメント演算を加えているのと同じと言えますね)

 
Alexey Navoykov:

言葉の明らかな欠陥に神聖な意味を求める必要はないのです。

どのように、そしてなぜそれが機能するのかを説明されましたが、もしそれがあなたにとって難しいのであれば - 幸いにも私は助けることができませんが...。
これは神聖な意味ではなく、ユーザーの入力レベルを下げ、"this. "を使わずにベースクラスのフィールドやメソッドにアクセスできるようにするための一般的な手法であり、ベースクラスの関数をオーバーロードする場合にも使用される。