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

 
Nikolai Semko:

特に、コードを 最小限に簡略化することで、ある種の不正確さをもたらしていることをお詫びします。
- 関数に渡されるオブジェクトが同じサイズになるようにしました(コード更新)。
- このため,2つのアルゴリズムを1つの関数にインライン化することはできません(コード更新).

 
Sergey Dzyublik:

特に、コードを 最小限に簡略化することで、ある種の不正確さをもたらしていることをお詫びします。
- 関数に渡されるオブジェクトが同じサイズになるようにしました(コード更新)。
- このため,2つのアルゴリズムを1つの関数にインライン化することはできません(コード更新).

class C{
public:
   struct A{
   public:
      char aaa;
      
      A (char value = 0) : aaa(value){}
      void set(char value){
         aaa = value; 
      };
      uint Type(){return 0x778F6712;}
      char get(){return aaa;}
      A Get() {return this;}
   };
   
   void test(A&, A& a1, A& a2){
      printf("1");
      a1.aaa = a2.aaa;
   }
   
   template<typename T>
   void test(A& a, T& d1, T& d2){
      if (a.Type()== d1.Type()) test(a,d1.Get(),d2.Get());
      else {
      printf("2");
      d1.set(d2.get());}
   }
};

struct B : public C::A{};


struct D{
private:
   char data;
public:  
   D(char value = 0) : data(value){}
   void set(char value){
      data = value; 
   };
   uint Type(){return 0x308FD7FE;}
   char get(){return data;}
   D Get() {return this;}
};


void OnStart(){
   C c;

   B b;
   D d;
   
   c.test(b, b, b);    // 1      should be: 1
   c.test(b, d, d);    // 2      should be: 2   
}


あるいはこんな感じ。

class C{
public:
   struct A{
   public:
      char aaa;
      
      A (char value = 0) : aaa(value){}
      void set(char value){
         aaa = value; 
      };
      char get(){return aaa;}
      A Get() {return this;}
   };
   
   void test(A&, A& a1, A& a2){
      printf("1");
      a1.aaa = a2.aaa;
   }
   
   template<typename T>
   void test(A& a, T& d1, T& d2){
      printf("2");
      d1.set(d2.get());
   }
};

struct B : public C::A{};


struct D{
private:
   char data;
public:  
   D(char value = 0) : data(value){}
   void set(char value){
      data = value; 
   };
   char get(){return data;}
   D Get() {return this;}
};


void OnStart(){
   C c;

   B b;
   D d;
   
   c.test(b.Get(), b.Get(), b.Get());    // 1      should be: 1
   c.test(b.Get(), d.Get(), d.Get());    // 2      should be: 2   
}
 
解決策をありがとうございます。
使用するオブジェクトの構造を変更する必要があり、ロジックが汚れるので理想的ではありませんが、うまくいきますね。

そして、そうです、test:
の上にラッパー関数を作る方が良いのです。
   template<typename T>
   void test(A& a, T& t1, T& t2){ 
      __test(a, t1.CastToMain(), t2.CastToMain());
   }
次に、プロジェクト 内のすべての呼び出しを検索します:
   c.test(b, b.CastToMain(), b.CastToMain());    // 1      should be: 1
   c.test(b, d.CastToMain(), d.CastToMain());    // 2      should be: 2  
とにかく、どうもありがとうございました。
 
Sergey Dzyublik:
解答ありがとうございました。
使用するオブジェクトの構造を変更する必要があり、ロジックが汚れるので理想的とは言えませんが、効果はあります。

そして、そうです。すべての呼び出しをプロジェクト内で検索するよりも、test:
の上にラッパー関数を作る方が良い
のです。
とにかく、どうもありがとうございました。

はい、そうですね。

 

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


テンプレート機能/クラスワークの不具合。
( MT5(ビルド2345)では修正 されていません)** コンパイルエラー、テンプレート関数内のバグ、明示的な型変換 操作で渡されたポインタは、クラスのように動作し、それ以外の場合はポインタのように動作します。
( MT5(ビルド2345)では修正 されていません)** コンパイルエラー、内部クラス使用時のテンプレートクラスコード生成の不具合。
( MT5(ビルド2345)では修正 されていません)** テンプレート関数のテンプレートパラメータで内部クラスにアクセスしようとすると、コンパイルエラーになります。
( MT5(ビルド2345)では修正 されていません)** コンパイルエラー、テンプレートメソッド/クラス生成時のバグ、テンプレートパラメータ「オートコンプリート」処理がメインプログラムコードにスコープ外れる。
( MT5(ビルド2345)では修正 されていません)* コンパイルエラー、テンプレートクラスがテンプレートメソッドの戻り値として機能する場合、テンプレートクラスのコードが自動生成されない不具合。
( MT5(ビルド2345)では修正 されていません)* コンパイルエラー、内部クラス定義のバグ - ベースクラス定義時にグローバル名前空間への参照がない。
( MT5(ビルド2345)では修正 されていません)*(new) コンパイルエラー 内部構造体をテンプレート関数に渡すと、テンプレートクラス内の別の内部構造体の ベースデータ型として 使用できない不具合が発生。
( MT5(ビルド2345)では修正 されていません)*(new) コンパイルエラー オーバーロードされた非テンプレート関数から、明示的な引数型を持つテンプレート関数を呼び出すと、バグが発生します。


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



提案します。
ref- リテラルと一時変数を const ref 引数として関数に渡すことができるようになりました。
link- プロジェクトタブでプロジェクトファイルを移動 する際、移動したファイルが開いていてMEタブにある場合、自動的にその場所のパスを更新するようにしました。
link- MQLにtypedef宣言機能を導入する。
link- デフォルトのコピーコンストラクタと代入演算子を強制的に生成できるようにすることについて。

 

Sergey Dzyublik:
Спасибо за вариант решения

リンクは一時的なコピーなので、構造を変更することはできません。

 
Andrei Trukhanovich:
リファレンスは一時的なコピーなので、構造を変更することはできません

一般的なケースはその通りですが...。
しかし、特定のケースではもっと複雑で、実際には与えられた構造体はイテレータ であり、変更されるのはその内容ではなく、それが参照するオブジェクトである。
だから、特殊なケースで問題が解決され、感謝しています。

 
MT5 (build 2345)で、オブジェクトがテンプレートクラス/構造体の場合、"in place created "オブジェクトを返す不具合が多数発生しました。

class A{
public:
   A(int, int, int){};  
   A(const A&){}
   A(const A*){}
};

// simple class type
A* test_a_ptr_ptr(){
   return &A(1,2,3);               //OK
};

A test_a_class_class(){
   return A(1,2,3);                //OK
};

A test_a_ptr_class(){
   return &A(1,2,3);               //OK
};


template<typename T>
class B{
public:
   B(int &){}
   B(long){}
   B(int, int, int){};  
   B(const B&){}
   B(const A*){}
};

// template class type
B<A*> test_b_class_class(){
   B<A*> b(1);
   int x = 22;
   
   return B<A*>();              // Compile Error: ambiguous call to overloaded function with the same parameters: "B(long)" and "B(const A*)"
   return B<A*>(1,2,3);         // Compile Error: only one argument is acceptable, argument should be castable to int
   return B<A*>(x);             // Compile Error: argument is passed by value instead of by reference.
   return B<A*>((A*)NULL);      // Compile Error: 'int' - invalid cast operation        
   return B<B<B<long>>>(1);     // Compile Error: OK, template parameter type does not provide any effort on compilation result
   
   return b;
};

B<A*>* test_b_ptr_ptr(){
   B<A*> b(1);
   
   return &B<A*>(1);            // Compile Error: '&' - illegal operation use
   return &b;                 
};


void OnStart (){ 
   // simple class type
   A* a_ptr = test_a_ptr_ptr();
   A a0 = test_a_class_class();
   A a1 = test_a_ptr_class();
   
   // template class type
   B<A*> b0 = test_b_class_class();
   B<A*>* b_ptr = test_b_ptr_ptr();
}
 

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

バグ、バグ、質問

セルゲイ・デジブリク さん 2020.03.01 12:53

class A{
public:
   A(int, int, int){};  
   A(const A&){}
   A(const A*){}
};

// simple class type
A* test_a_ptr_ptr(){
   return &A(1,2,3);               //OK
};

もし私が正しく理解しているならば、この関数は存在しないオブジェクトへのポインタを返すのでしょうか?

 
fxsaber:

この関数は、存在しないオブジェクトへのポインタを返すという理解でいいのでしょうか?

はい、この例では、この関数は存在しないオブジェクトへのポインタを返します。
このコードの主な目的は、単純なクラスには動作する機能があり、同時にテンプレート・クラスには実際には何もないことを示すことです。