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

 
Sergey Dzyublik:


現在、テンプレートクラス内で宣言された静的変数を 使用することはできません。
名前空間の導入で、この制約を回避できるのでは?

はい、できます。

コードは若干異なり、より正しいものになります。以下はその例です。

//+------------------------------------------------------------------+
//|                                                  ScopeSample.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
class A
  {
public:
   struct Item
     {
      T                 value;
      
      Item(T initial=10):value(initial) { Print(__FUNCSIG__); }
     };

   static Item       s_default;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
class B
  {
public:
   struct Item
     {
      T                 value;
      
      Item(T initial=100):value(initial) { Print(__FUNCSIG__); }
     };

   static Item       s_default;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
A::Item A::s_default;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
B::Item B::s_default;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print(A<int>::s_default.value);
   Print(B<int>::s_default.value);
  }
//+------------------------------------------------------------------+


結果

2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) A<int>::Item::Item(int)
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) B<int>::Item::Item(int)
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) 10
2019.05.24 17:16:20.225 ScopeSample (EURUSD,H1) 100
 
とてもかっこいいです、ありがとうございました。
ネームスペースに対応したMTのα版アクセスは可能か?
バグや脆弱性などを探すためではなく、「スマートコンテナ」を書けるようになることが研究の一環として本当に必要なのです。
 

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

バグ、バグ、質問

セルゲイ・デジブリク, 2019.05.23 13:52

この間、ブローカーと一緒に仕事をしていて、MTのバグや「クセ」が十数個もわかってしまったんです。
修正されるのを待つ価値があるかどうかを知るにはどうしたらいいのでしょうか?
新しいビルドが出るたびにすべてをテストすることを提案しないでください。

(MT5(ビルド2059)では修正されていません)"テンプレート関数に(void*)(NULL)パラメータを渡すとコンパイルエラーになる".
(MT5(ビルド2059)で修正)"ストラテジーテスター:2パスの予定が、実際には無限大のパス数>「OnInit critical error」エラーにより900pc "となる。
(MT5(build 2059)では修正されていません)"Invalid value of array size field within default assignment operator for structures with dynamic arrays" (動的配列を持つ構造体のデフォルトの代入演算子の配列サイズフィールドが無効です).
(MT5(build 2059)では修正されていません)"関数からクラスオブジェクトを値で返すとき、コンパイラはデフォルトのクラスコピーコンストラクタを見ません".
(MT5(build 2059)で修正)"コンパイラは、パターンクラスと「複雑な」構造のための「それ自体」の型キャストを見ることができません".
(MT5(build 2059)では修正されていません)"typedef で作業する場合、明示的に特殊化されたテンプレート関数を使用すると、 このテンプレート関数用のコードが生成されません。
(MT5(build 2059)では修正されていません)"typedef 内で同じ関数シグネチャを再利用するとコンパイルエラーになる".
#
(MT5(ビルド2059)では未修正) "文字列処理用の関数のかなりの部分が、文字列内のNULL文字で動作しない(例: ShortArrayToString, StringInit, StringFill)"。
(MT5(build 2059)では修正されていません)"StringSetLength関数は、文字列の長さを「切り詰める」ためにのみ動作し、増やすことはできません。
#(MT5(ビルド2057)で修正)"Strategy Tester: 750 "metatester64.exe" processes are running".
"フォーラム www.mql5.com, 画像付きのメッセージを編集すると、前の画像が新しい画像に置き換えられない".


提案します。
"デフォルトの代入演算子(コピーコンストラクタ)のコード生成/削除をユーザーに強制することを許可する".
"ArrayCopyがクラスや「複雑な」構造体をコピーできるようにし、構造体があらゆるオブジェクトタイプに対して深いコピー機能を提供するのと同様にする".
"動的な配列を扱う際に、ユーザが容量値を読み取る/設定する機能を提供する".

"シグナルズサービスのインフォグラフィックスを改善するための変更点"


 

今日、私のターミナルで、私のリアル 先物市場口座、ブローカーOtkritieのティック履歴がアップロードされていません。

テロップのデータが変化している。

現在2019.05.24 23:40

端末は2019.05.23の最終ティックを搭載しています。


自分で取引したものを含め、他のいくつかの楽器でも同じ状況です。

別の端末(別の設定)で、同じブローカーの別のアカウントで、効果は同じです。

 
エキスパートが最適化 モードで作業しているか、シングルテストモードで 作業しているか、見分けがつきますか?
 
MT5(ビルド2059)
テンプレート関数に(void*)(NULL)パラメータを渡すと、コンパイルエラーになります。
class C{
public:
   template<typename T>
   static void func(T ){
      Print(__FUNCSIG__);
   }
};


void OnStart(){  
   void* c_ptr = new C();
   
   C::func((C*)NULL);     // Ok
   C::func(c_ptr);        // Ok
   C::func((void*)NULL);  // 'void' - illegal use of 'void' type
   
   delete c_ptr;
}
(ビルド2057)では全て動作していたので、もしかしたら修正で何かが狂ってしまったのかもしれません。
テンプレートクラスと「複雑な」構造体に対して型キャスト「自身」を実行するとコンパイルエラーに なる# です
 
C++になぞらえて、「本格的な」nullptrポインタを導入するのが良いのかもしれませんね?
 

ビルド2056に戻ると、すべてがうまくいきました。しかし、2059年にはすでにコンパイルエラーになっている。

void OnStart()
{
class A {};
//#define void  A //(*)
        const void *p1;
              void *p2 = (void *)p1; //Error: 'void' - class type expected
}

そして、voidをA(*)に置き換えれば、すべてOKです。どんな違いがあるのでしょうか?

また、この場合でもコンパイルエラーが発生します。

              void *p2 = (void *)p1; //Error: 'void' - class type expected
 

コマンドビルドでコンパイルすると2059x32の抽象的なエラーが発生します。

が、IDEで再現されない - 偶然かもしれませんが

 
A100:

テンプレートとvoid*の使い分けは?