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

 
株式市場の計算に重大なバグがあるのに気にしていない、問題が意図的に気づかれないのか偶然なのか不明である
 
Aleksey Vyazmikin:

私の場合は、使えるロジックがないのが辛いところです。

これらの入力を持つ関数があります。

そのため、このFunctionは時々769という値を出力します。

最初のプリントをアンコメントすると

とすると、正しい値が表示されます。

エラーが発生した瞬間に関数が呼び出さ れた時点でアクティブになっていないコードだけを削除して関数を切り詰めると、エラーも発生しない。

明らかにコンパイラのエラーです。開発者の皆さん、この関数の全文を誰に送ればいいのでしょうか?

スイッチを通してやったが、すべてうまくいった。それなら、コンパイラのせいでしょう。

 
ストレージにコミットできない...
 
Alexey Kozitsyn:
ストレージにコミットできない...

すでに効果が出ているのだと思います。

 
Artyom Trishkin:

すでに効果が出ているのだと思います。

はい。

 
MT5のバグ(build 2345)、以前説明したバグの 別の現れで、テンプレート関数に渡されたポインタが、ある操作ではデータ型ポインタとして、他の操作ではデータ型クラスとして動作します。

#define  PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
T test(T ptr){
   PRINT(typename(ptr));   // A*
   PRINT(typename(T));     // A*
   
   T new_ptr = new T();
   return (new_ptr);
}


class A{};
   
void OnStart(){    
   A a;
   test(&a);                   // Compile Error: OK
}
 

バグMT5 (build 2345)、テンプレートクラス内でテンプレート関数を宣言する際に、再利用されるテンプレート型名がチェックされず、予期せぬ動作をする。

#define  PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
class A{
public:   
   template<typename T>         // Compile Error: OK
   T test(T p){
      B b = NULL;
      PRINT(typename(B));       // C*
      PRINT(typename(b));       // C*
      return b;
   }
   
   //real template
   template<typename TT>
   TT test_real(TT p){
      TT b = NULL;
      PRINT(typename(TT));       
      PRINT(typename(b));        
      return b;
   }
};

class B{};
class C : public B{};

   
void OnStart(){  
   A<B> a; 
   B b;
   C c;
    
   C* c_ptr = a.test(&c);
}
 
MT5 (build 2345)で、テンプレートクラスのメソッドを 使用する際にカプセル化が欠落する不具合。

class B{
private:
   template<typename T>
   void you_cannot_call_private_method(T n){
      printf("Wow, Nice job.");
   }
};
   
void OnStart(){  
   B b;   
   b.you_cannot_call_private_method(1);          // Wow, Nice job.
}
 
MT5 のバグ(ビルド 2345)において、基底クラスのコンストラクタで、基底クラスのオブジェクトへのポインタを親クラスへのポインタにキャストするための明示的な型キャストを実行できない。

#define  PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
class A{
   T* virtual_call;
   
public:   
   A(T* ptr){
      virtual_call = dynamic_cast<T*>(&this);
      PRINT(virtual_call == NULL);              // true, virtual_call == NULL
      
      virtual_call = dynamic_cast<T*>(ptr);
      PRINT(virtual_call == NULL);              // false, virtual_call != NULL
      
      virtual_call = (T*)(&this);               // Execution Error: Incorrect casting of pointers.
      virtual_call = (T*)(ptr);                 // OK
   } 
      
   template<typename TT>
   void test(TT n){
      virtual_call.__test(n);
   }
   
   template<typename TT>
   void __test(TT n){
      printf("AAAA");
   }
};


class B : public A<B>{
public:
   B() : A(&this){}

   template<typename TT>
   void __test(TT n){
      printf("BBBB");
   }
};
   
class C : public A<C>{
public:
   C() : A(&this){}
};

   
void OnStart(){  
   B b;   
   b.test(1);        // should be "BBBB"
   
   C c;
   c.test(1);        // should be "AAAA"
}

仮想テンプレート関数の「パターン」エミュレーションを実装するには、型継承の他に、親クラスへのポインタの直接値をベースクラスに引き込む必要があることが判明し、これはまずい...と思いました。
 

どなたか、これをコンパイルされた方はいらっしゃいますか?

class B {};

template<typename T>
class A
{
    static T *array;
    
    static void check()
    {
      T *ptr = array; // unresolved static variable 'A<B>::array'
    }
};

class Y: public A<B>
{
};

template<typename T>
static T *A::array;

void OnStart()
{
  Y y;
}

どうしたんですか?