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

 

MT5のバグ(ビルド2367)MQLのテンプレート関数の実行優先順位がC++のそれと一致しない(オンライン:https://onlinegdb.com/B172m1PLL)
バグ フィックスの一環として、コンパイル時のバグが修正されたようですが、オーバーロードされたテンプレート関数の実行優先順位がC++の動作とまだ一致していないようです。

template<typename T>
struct B{
   T data;
};

template<typename T>
struct BB : public B<T>{};


template<typename T>                                             
struct A{
public:
   static void test(T& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};

                                         
struct AA{
public:
   static void test(B<int>& src){
      printf("1");
   }
   
   template<typename TT>
   static void test(B<TT>& src){
      printf("2");
   }
};
      

void OnStart(){
   BB<int> bb;
   
   A<B<int>>::test(bb);         // MQL:2,  should be 1     
   AA::test(bb);                // MQL:2,  should be 1     
}
 

おかしな問題にぶつかった。マクロに複数の型パラメータを持つテンプレート型を渡すことはできません。なぜなら、プリプロセッサはテンプレートを扱っていることを知らず、パラメータをカンマで区切って考えるからです。

SOの 中にC++の問題とその解決策の記述がありました。

#define  COMMA ,
#define  XYZ(type) {type ptr;}

XYZ(TemplatedType<A COMMA B>); // ошибка

MQLで試してみましたが、残念ながらうまくいきませんでした。コンパイラは、渡された型で記述された変数に対して、"undeclared identifier "というエラーを出します。

今までは派生クラスを追加して管理していましたが、C++のように修正しても良いでしょうか?

おっとっと。解決策を発見このような仕組みになっています。

#define  COMMA() ,
疑問が解消される。
Passing a template type into a macro
Passing a template type into a macro
  • 2017.05.30
  • bitmaskbitmask 22.3k1111 gold badges7070 silver badges133133 bronze badges
  • stackoverflow.com
I have a macro that takes a number of arguments, one of which is a type. For instance: If I try to instantiate this with a template type, say: This will not work as intended, as the pre-processor knows nothing of templates. It will...
 

MT5(build 2367)のバグで、オーバーロードされたテンプレート関数の位置がコンパイル結果に影響する。
作業が行われたオリジナルのチケット -https://www.mql5.com/ru/forum/1111/page2655#comment_15119627
C++オンライン(https://onlinegdb.com/BJzbH2DLL)


class input_iterator_tag  {};
class forward_iterator_tag       : public input_iterator_tag         {};
class bidirectional_iterator_tag : public forward_iterator_tag       {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  forward_iterator_tag*  tag){
   printf("2\r\n");
   return set_value(it, value, (input_iterator_tag*)NULL);                // 'set_value' - ambiguous call to overloaded function        
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const  bidirectional_iterator_tag*  tag){
   printf("3\r\n");
   return set_value(it, value, (forward_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it,  _Tp &value, const random_access_iterator_tag* tag){
   printf("4\r\n");
   return set_value(it, value, (bidirectional_iterator_tag*)NULL);
};

template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &val,  _Tp &value, const input_iterator_tag* tag){
   printf("1\r\n");
   return val;
};


template<typename _Iterator, typename _Tp>
_Iterator set_value(const _Iterator &it, _Tp &value){
   return set_value(it, value, it.tag);                        
};


template<typename T>
struct A{
   T data;
   static random_access_iterator_tag* tag;
};

template<typename T>
random_access_iterator_tag* A::tag = NULL;

class B{};


void OnStart (){ 
   A<B*> it;
   const B* const b_ptr = new B();
   set_value(it, b_ptr);                                      
   
   A<int> it_int;
   const int value_int = 5;
   set_value(it, value_int);         
}

int main(){
   OnStart();
   return 0;
};
 

テンプレート機能/クラスキャッシュの動作に不具合があります。
( MT5(ビルド2368)で修正 されました)***(up) Undefined Behavior, 内部型 "C" の複雑なラップオブジェクトを何度か作成し、それが全く別のデータ型、多分 "B" か、多分 "int" か、何でも良いのですが、判明した場合...。
( MT5(ビルド2368)で修正 されました)* コンパイルエラー、const ref テンプレート引数として関数ポインタを渡す際のバグ。
( MT5(ビルド2368)で修正 されました)* コンパイルエラー、B<int>オブジェクトはB<void*>オブジェクトの後に作成しても良いが、前に作成するとコンパイルエラーになる。


テンプレート機能/クラスワークの不具合。
( MT5(ビルド2368)で修正 されました)*** コンパイルエラー、テンプレート関数内のバグ、明示的な型変換で 渡されたポインタは、それ以外の場合、クラスのように動作します。
( MT5(ビルド2368)で修正 されました)**(アップ) コンパイルエラー、テンプレート関数のテンプレートパラメータで内部クラスにアクセスしようとした場合の不具合。
( MT5(ビルド2368)では修正 されていません)*** Compile Error, main complaint is an inappropriate output warning - "deprecated behavior, hidden method calling will be disabled in the future MQL compiler version". 現在の実装は、羽を持った鳥を撃っているようなものです。
( MT5(ビルド2368)では修正 されていません)** テンプレート関数の戻り値が、テンプレート関数の引数の型によって設定されるテンプレートクラス内の内部クラスである場合の、コンパイルエラーです。
( MT5(ビルド2368)では修正 されていません)** テンプレートコンストラクタにおいて、継承時と内部クラスで同じクラス名を使用している場合に、ベースクラスを呼び出すと、コンパイルエラー、名前空間、スコープのバグが発生します。
( MT5(ビルド2368)では修正 されていません)* コンパイルエラー、オーバーロードされた非テンプレート関数から呼び出された場合の、明示的な引数型によるテンプレート関数呼び出しのバグ。
( MT5(build2368)では未修正) コンパイルエラー、内部クラス定義に関するバグ - ベースクラス定義時にグローバル名前空間への参照がない。
( MT5(ビルド2368)で修正 されました)** コンパイルエラー、内部クラス使用時のテンプレートクラスコード生成の不具合。
( MT5(ビルド2368)で修正 されました)** コンパイルエラー、テンプレートメソッド/クラス生成時のバグ、テンプレートパラメータの自動置換の処理がメインプログラムコードにスコープ外である。
( MT5(ビルド2368)で修正 されました)* コンパイルエラー、テンプレートクラスがテンプレートメソッドの戻り値として機能する場合、テンプレートクラスのコードが自動生成されない不具合。
( MT5(ビルド2368)で修正 されました)* コンパイルエラー 内部構造体をテンプレート関数に渡す際、テンプレートクラス内の別の内部構造体の基本データ型として、結果のデータ型を 使用できないバグが発生しました。
( MT5(ビルド2368)で修正 されました)* コンパイルエラー、テンプレートクラス内でテンプレート関数を宣言する際、再利用されるテンプレート型名のチェックが行われないため、予期せぬ動作が発生します。
( MT5(build 2368)で修正) コンパイルエラー、オブジェクトがテンプレートクラス/構造体の場合、"in place created" オブジェクトを返すことに関連する複数の不具合が発生する。
(MT5(ビルド2368)では修正 されていません)* ベースクラスのコンストラクタで、ベースクラスのオブジェクトへのポインタを親クラスへのポインタに変換する際に、明示的なタイプキャストを行うことができません。


MQLとC++のオーバーロードされた関数の呼び出しの優先順位の不一致に関する不具合。
( MT5(ビルド2368)で修正 されました)**(アップ) コンパイルエラー オーバーロードされたテンプレート関数の呼び出し優先度は、実際にはテンプレートパラメータの型に依存し、理論的にはコンパイル結果には影響しません。
( MT5(ビルド2368)で修正 されました)最初のオーバーロードされたテンプレート関数が完全に特化されたテンプレートベースクラスを使用し、 2番目のオーバーロードされたテンプレートが特化されていないテンプレートベースクラスを使用する場合、 **(up) Compile Error となります。
( MT5(ビルド2368)では修正 されていません)** コンパイルエラー:渡されたパラメーターに適したシグネチャーを持つオーバーロードされたテンプレート関数が存在するにもかかわらず、テンプレート関数のコードを生成する際にコンパイルエラーが発生します。
( MT5(ビルド2368)では修正 されていません)* テンプレートパラメーターの数が異なるオーバーロードされたテンプレート関数を呼び出すと、コンパイルエラー「ambiguous call to overloaded function」が発生します。
( MT5(ビルド2368)で修正 されました)*** A <= B <= C <= D のクラスを継承し、パラメータ A* とパラメータ B* を持つ 2 つのオーバーロード関数を実装した場合、MQL でその関数にオブジェクト C* または D* を渡すと、コンパイルエラー "ambiguous call to overloaded function" が発生することがあります。
( MT5(ビルド2368)で修正 されました)** ランタイム、オーバーロードされたテンプレート関数の呼び出しに対する優先度の不一致。

関数実行の遅さ、コードオプティマイザの性能に関する不具合。
( MT5(ビルド2368)で修正 されました)** ランタイム、ArrayResizeを使用して配列に一度に1つの要素を追加する際に、それらのためのメモリが予約されているにもかかわらず、大きなオーバーヘッド、例えば、構造体は、最大7倍遅くなる。


提案します。
(new)link- クラスの静的メソッドに対するインテリセンスの作業をベースにした、名前空間の機能に対するインテリセンス・サポートの実装について。
link- リテラルと一時変数を const ref 関数の引数として渡せるようにします。
link- プロジェクトタブでプロジェクトファイルを移動 する際、移動したファイルが開いていてMEタブにある場合、自動的にその場所のパスを更新するようにしました。
link- MQLにtypedef宣言機能を導入する。
link- デフォルトのコピーコンストラクタと代入演算子を強制的に生成できるようにすることについて。

 
MT5 (build 2368) のバグで、テンプレートクラスで継承する際にデフォルトのアクセス修飾子を 使用すると、テンプレートパラメータがベースクラスとして機能する場合、コンパイルエラーが発生します。
以前はすべてうまくいっていたのですが、どうやら他のバグを修正する一環として何かが壊れたようです。

class A{};

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

template<typename T>
class BB : private T{};

   
void OnStart(){    
   BB<A> bb;      // Ok
   B<A> b;        // Compile Error: 
}
 

MT5のバグ(ビルド2368)明示的なベースクラス表示で代入文を呼び出すとコンパイルエラーに なる。 この問題は、テンプレートパラメータをベースクラスとするテンプレートクラスで 発生します。
以前は動作していたのですが、どうやら他のバグ修正の一環で何かが壊れたようです。

struct A{
   uchar data;
   void operator=(int n){
      printf("1");
   }
};

template<typename T>
struct B : public T{
   void operator=(int n){
      T::operator=(n);    //'operator' - undeclared identifier  
   }
};

   
void OnStart(){    
   B<A> b;        
   b = 0;
}
 
2020.03.08からのMT5アップデートは、皆さん取引履歴が 飛ぶようになったのでしょうか?
ファイル:
 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

fxsaber, 2020.03.22 10:04

mq5はOKです。mq4が壊れました。TypeToBytes_ExampleScript.mq4はこちらから 入手可能です。 拡張子をmq5に変更した場合のみ、コンパイルされます。

2368 - 何も変わっていない。

 

1台のMT5ターミナルで、いつでもどのブローカーの口座にもログインできました。最初のログインに問題があれば、ターミナルのツールを使って適切なブローカーを探し、その取引サーバーのデータを自動的に取得するだけです。その後、問題なくログインできるようになりました。


今日、私は初めて(新しいブローカー)、何も助けないという状況に直面しました。ログインできません。ログの書き込みで。

2020.03.25 09:50:33.538  'xxx': no connection to XXX-Server


ブローカーのネイティブターミナルをダウンロードしたところ、すぐにログインできるようになりました。私の研究端末......まさか。このようなことは初めてです。

非ネイティブの端末で取引口座に接続できるようにする方法を教えてください。

 
fxsaber:

非ネイティブの端末を取引口座に接続できるようにする方法を教えてください。

mt4では、server.iniファイルを別の端末にコピーして、トレードサーバーを探す必要がないようにしました。

mt5でわからない