Hatalar, hatalar, sorular - sayfa 2653

 
Vladimir Simakov :

Eh, STL bire bir kaydırılmaz. Burada ayrıntılara daha yakından bakmak gerekiyor.

Sıcakla yumuşaklığı karıştırıyorsunuz.
Soru STL'de değil. Orada kendim çözeceğim ... (eğer biri değişmezse, bu prensipte bunu yapmanın mümkün olmadığı anlamına gelmez)

En kolay yol, temel sınıf veya arabirimde ve varislerde - ya uygulama ya da =delte - soyut yöntemlerle tüm olası işlevleri yazmaktır.
Bu durumda, aynı temel sınıfın türüne sahip işaretçiler veya referanslar yöntemlere iletilir.
Doğru, sanal bir masa şeklinde kaçınılmaz bir kötülük var, ama Tanrı onu kutsasın, ancak mimariyi dinamik_cast aracılığıyla hiçbir yerde pahalı dallanma olmayacak şekilde inşa etmek arzu edilir.

Önerdiğiniz yöntem daha önce uygulandı ve aynı hatayla da karşılaşıyor: https://www.mql5.com/ru/forum/1111/page2648#comment_15015191


Bir işaretçi/sınıf parametresinde örtük bir tür dönüştürme gerçekleştirildiğinde aşırı yüklenmiş işlev çağrısı önceliklerinde hata.
C++'da - her şey yolunda, ancak MQL'de - derleme hatası "aşırı yüklenmiş işleve belirsiz çağrı"
Yukarıda baypas seçeneklerinden biri önerilmiştir, ancak büyük ve kullanışlı değildir ve aynı arzu işlevinden bir düzine daha fazla kullanmanın bir yolu yoktur.
Belki daha kolay bir şey vardır?

 
Makrolar işlerini yapıyor, tuvali bir görünümde kesmeyi başardık (tam sürüm ek dosyada):
 //+------------------------------------------------------------------+
//|  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 

Geliştiriciler, lütfen söyleyin, hatayı düzeltmek mi planlanıyor yoksa mimari olarak imkansız mı?
Dosyalar:
 
Hata MT5 (2323 oluşturun),
bir şablon işlevi içinde, açık bir döküm işleminin parçası olarak geçirilen işaretçi bir sınıf gibi davranır ve buna göre bir derleme hatasına neden olur:
 #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);
};
 

Aptal, basit bir sorunu çözemem. Danışmanı başlatmak için aşağıdaki ayarlarla ticaretin yasak olduğunu anlamak gerekir.


Böyle bir çek yuvarlanmaz.

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


OrderCheck - bir toptan serçelere. Tavsiye lütfen.

 
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 kodu

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

Teşekkürler, MQL_TRADE_ALLOWED fark etmedim.

 
fxsaber :

Aptal, basit bir sorunu çözemem. Danışmanı başlatmak için aşağıdaki ayarlarla ticaretin yasak olduğunu anlamak gerekir.


Böyle bir çek yuvarlanmaz.


OrderCheck - serçelerdeki bir toptan. Tavsiye lütfen.

Size tam olarak bir cep telefonundan söyleyemem ama işte burada: MQL_TRADE_ALLOWED
 
Hata MT5(build 2323), aynı şablon nesnesi B<int>, B<void*> sınıfının nesnesinden sonra oluşturulabilir, ancak bunu daha önce yaparsanız, bir derleme hatası oluşur.
Belki de nedeni, şablon sınıfı oluşturucu önbelleğinin çalışmasıdır.

 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) hatası aynı kodu iki kez kullanır: ilk geçiş başarılı bir derlemedir, ikincisi bir derleme hatasıdır .
Görünüşe göre problemler şablon fonksiyon üreteci önbelleği ile ilgili.
" void run( const T &ff) " şablon işlevi, " void run ( const T ff ) " değerine göre geçiş ile referans tarafından geçiş ile değiştirilirse hata ortadan kalkar.

 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     
   }
}
 

Hata MT5(build 2340) Şablon işlevinin şablon parametresi için dahili sınıfa erişmeye çalışırken derleme hatası .

 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);
}