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

 
Vladimir Simakov:

まあ、STLは一長一短なんですけどね。ここでは、具体的な内容に大いに注目する必要があります。

ソフトとウォームを混同している
STLがどうのこうのという問題ではありません。そこは自分で考えよう...。(無い袖は振れぬ)

最も簡単な方法は、ベースクラスまたはインターフェイスで抽象的なメソッドを使用して、可能なすべての機能を実装し、子孫で - 実装または=delteのいずれかです。
この場合、ベースクラスのメソッドに同じ型のポインタまたは参照を渡す必要があります。
仮想テーブルという弊害はありますが、高価なdynamic_castの分岐がどこにもないようなアーキテクチャにしたほうがよいでしょう。

あなたが提案した方法は、以前に実装され、また同じバグに掛かっています: https://www.mql5.com/ru/forum/1111/page2648#comment_15015191


ポインタ/クラスパラメータに対して暗黙の型変換が行われた場合に、リロードされた関数を呼び出す際の優先順位にバグがあります。
C++ではすべてOKですが、MQLではコンパイルエラー「ambiguous call to overloaded function」
回避のバリエーションが一つ上に提案されていますが、大きくて不便ですし、何十もの似たような関数に使う気にはなれません。
もしかしたら、もっとシンプルなものがあるのでは?

 
マクロが仕事をし、キャンバスを フォームに縮小することができました(フルバージョンは添付ファイル)。
//+------------------------------------------------------------------+
//|  MQL realization                                                 |
//+------------------------------------------------------------------+
#ifdef __MQL5__
   template <typename _InputIter>
   CREATE_MISSED_ITERATOR_FUNCTION_FW_P2(int, distance, _InputIter&, _InputIter&);
   
   template <typename _InputIter>
   CREATE_MISSED_ITERATOR_FUNCTION_RA_P2(int, distance, _InputIter&, _InputIter&);

   template <typename _InputIter>
   CREATE_MAIN_ITERATOR_FUNCTION_P2(int, distance, _InputIter&, _InputIter&, _InputIter);
   
   void OnStart(){
      MyIterator it1(1);
      MyIterator it2(5);
      printf("result:%d", distance(it1, it2));            
   }
#endif 

開発者の方、アドバイスをお願いします。バグを 修正する予定はありますか?それともアーキテクチャ的に不可能なのでしょうか?
ファイル:
 
MT5(build2323)の不具合。
テンプレート関数内部では、明示的な型変換で 渡されたポインタはクラスと同じように動作し、それに応じてコンパイル時エラーが発生します。
#define  PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
class ClassWrapper{
public:
   T data;
};

class ClassA{};
class ClassB : public ClassA{};


template<typename T, typename TT>
void func(const T &_wrapper, const TT &value){
   T wrapper = _wrapper;   
   
   PRINT(typename(wrapper.data));         // Ok: ClassA*
   PRINT(typename(value));                // Ok: ClassA*
   PRINT(typename(TT));                   // Ok: ClassA*
   
   //wrapper.data = (TT)(value);          // Compiler Error: 'value' - object required  
   //wrapper.data = (TT)(wrapper.data);   // Compiler Error: 'data' - object required   
   
   ClassB b;
   PRINT(typename((TT)(b)));              // Result: C lassA. During explicit type conversion, TT is "ClassA" instead of "ClassA*"
};


void OnStart(){
   ClassWrapper<ClassA*> a_ptr_wrapper;
   
   ClassA a;
   const ClassA* a_ptr = &a;
   func(a_ptr_wrapper, a_ptr);
};
 

頭が悪い、簡単な問題も解けない。以下のEA起動設定中は、取引が禁止 されていることを理解したいのですが。


このチェックはうまくいきません。

int OnInit()
{
  Alert(AccountInfoInteger(ACCOUNT_TRADE_EXPERT) &&
        AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) &&
        TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)); // true
        
  return(INIT_FAILED);
}


OrderCheckは赤信号。アドバイスをお願いします。

 
bool CheckTradingPermission()
  {
//--- Для режима реального времени
   if(IsRealtime())
     {
      //--- Проверка соединения с сервером
      if(!TerminalInfoInteger(TERMINAL_CONNECTED))
         return(false);
      //--- Разрешение на торговлю на уровне данной запущенной программы
      if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
         return(false);
      //--- Разрешение на торговлю на уровне терминала
      if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         return(false);
      //--- Разрешение на торговлю для текущего счета
      if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
         return(false);
      //--- Разрешение на автоматическую торговлю для текущего счета
      if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
         return(false);
     }
//---
   return(true);
  }
ANATOLI KAZHARSKI コード

Anatoli Kazharski
Anatoli Kazharski
  • www.mql5.com
Опубликовал статью ZigZag всему голова (Часть II): Примеры получения, обработки и отображения данных В первой части был описан модифицированный индикатор ZigZag и класс для получения данных индикаторов такого типа. Теперь мы покажем как создать индикаторы на основе этих инструментов, а также напишем эксперта для тестов, который будет заключать...
 
Fast235:
ANATOLI KAZHARSKI コード

ありがとうございます、MQL_TRADE_ALLOWEDには気がつきませんでした。

 
fxsaber:

頭が悪い、簡単な問題も解けない。以下のEA起動設定中は、取引が禁止 されていることを理解したいのですが。


このチェックはうまくいきません。


OrderCheckは赤信号。アドバイスをお願いします。

携帯からだとよくわからないのですが、以下です:MQL_TRADE_ALLOWED
 
MT5(build2323)で、B<void*>クラスのオブジェクトの後に同じテンプレートオブジェクトB<int>を作成できるが、その前に作成するとコンパイルエラーに なるバグ。
おそらく、テンプレートクラス生成キャッシュの働きが原因だと思われます。

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

void OnStart (){ 
   //B<int> b_int_0;    // Compiler Error  'void' - unexpected token, probably type is missing?
   B<void*> b;          // OK
   B<int> b_int_1;      // OK
}
 

バグ MT5(build 2340)は同じコードを2回使用します:1回目-コンパイル成功、2回目-コンパイルエラー

テンプレート関数 "void run(const T &ff)" の参照による転送を値による転送"void run(const T ff)"に置き換えると、エラーが 解消されます。

void func(){
}

template<typename T>
void run(const T &ff){
   ff();
}

void OnStart (){ 
   {
      typedef void(*f_ptr)();
      f_ptr ff = func;
      run(ff);             // OK
   }
   {
      typedef void(*f_ptr)();
      f_ptr ff = func;
      run(ff);            // Compile Error: 'ff' - parameter conversion not allowed     
   }
}
 

バグ MT5(build 2340) テンプレート関数のテンプレートパラメーターの内部クラスにアクセスしようとすると、コンパイルエラーに なる。

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


// Bypass Compile Error
template<typename T>
class GetClassType{
public:
   class type : public T{};
};


template<typename T>
void func(const T &b){
   T::C* c_ptr = new T::C;          // Compile Error: 'T' - struct undefined    
   
   // Bypass Compile Error
   GetClassType<T>::type::C* c_ptr_bps = new GetClassType<T>::type::C();
};

void OnStart (){ 
   B b;
   func(b);
}