오류, 버그, 질문 - 페이지 2653

 
Vladimir Simakov :

글쎄, STL은 일대일로 이동하지 않습니다. 여기서 구체적인 사항을 자세히 살펴볼 필요가 있습니다.

당신은 따뜻함과 부드러움을 혼동하고 있습니다.
질문은 STL에 없습니다. 나는 거기에서 스스로 알아낼 것입니다 ... (누군가가 움직이지 않는다면 이것이 원칙적으로 이것을 할 수 없다는 것을 의미하지는 않습니다)

가장 쉬운 방법은 기본 클래스나 인터페이스, 그리고 상속자(구현 또는 =delte)에서 추상 메서드를 사용하여 가능한 모든 기능을 작성하는 것입니다.
이 경우 동일한 기본 클래스 유형의 포인터 또는 참조가 메서드에 전달됩니다.
가상의 테이블 형태로 불가피한 악이 있는 것은 사실이지만, 신의 축복이 있기는 하지만 dynamic_cast를 통해 어디에도 값비싼 분기가 없도록 아키텍처를 구축하는 것이 바람직하다.

제안한 방법은 이전에 구현되었으며 동일한 버그가 발생합니다. https://www.mql5.com/ru/forum/1111/page2648#comment_15015191


포인터/클래스 매개변수에서 암시적 유형 변환이 수행될 때 오버로드된 함수 호출 우선순위의 버그입니다.
C++ - 모든 것이 정상이지만 MQL - 컴파일 오류 "오버로드된 함수에 대한 모호한 호출"
바이패스 옵션 중 하나는 위에서 제안한 것이지만 크기가 크고 편리하지 않고, 같은 욕구 기능을 수십 개 이상 사용할 방법이 없다.
아마도 더 쉬운 것이 있습니까 ??

 
매크로가 작업을 수행하고 있으며 캔버스 를 보기로 잘라낼 수 있었습니다(전체 버전은 첨부 파일에 있음).
 //+------------------------------------------------------------------+
//|  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(빌드 2323),
템플릿 함수 내에서 명시적 캐스트 작업의 일부로 전달된 포인터는 클래스처럼 작동하므로 그에 따라 컴파일 오류가 발생합니다.
 #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);
};
 

바보야, 나는 간단한 문제를 해결할 수 없다. 어드바이저 런칭 을 위한 다음 설정 으로 거래 가 금지 되었음을 이해 하는 것이 필요 합니다 .


이러한 수표는 굴러가지 않습니다.

 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 :

바보야, 나는 간단한 문제를 해결할 수 없다. 어드바이저 런칭 을 위한 다음 설정 으로 거래 가 금지 되었음을 이해 하는 것이 필요 합니다 .


이러한 수표는 굴러가지 않습니다.


OrderCheck - 참새의 대포에서. 조언 부탁드립니다.

휴대폰으로 정확히 말씀드릴 수는 없지만 MQL_TRADE_ALLOWED 입니다.
 
버그 MT5(빌드 2323), 클래스 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(빌드 2340) 버그는 동일한 코드를 두 번 사용합니다. 첫 번째 패스는 성공적인 컴파일이고 두 번째 패스는 컴파일 오류 입니다.
분명히 문제는 템플릿 함수 생성기 캐시와 관련이 있습니다.
템플릿 함수 "
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(빌드 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);
}