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

 

MT5 버그(빌드 2367) C++의 템플릿 기능과 비교하여 MQL의 템플릿 기능 실행 우선 순위가 일치하지 않습니다(온라인: https://onlinegdb.com/B172m1PLL ).
버그 수정의 일환으로 컴파일 오류가 수정되었지만 오버로드된 템플릿 함수의 실행 우선 순위가 C ++의 동작에 가져오지 않은 것 같습니다.

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

template < typename T>
struct BB : public B<T>{};


template < typename T>                                             
struct A{
public :
   static void test(T& src){
       printf ( "1" );
   }
   
   template < typename TT>
   static void test(B<TT>& src){
       printf ( "2" );
   }
};

                                         
struct AA{
public :
   static void test(B< int >& src){
       printf ( "1" );
   }
   
   template < typename TT>
   static void test(B<TT>& src){
       printf ( "2" );
   }
};
      

void OnStart (){
   BB< int > bb;
   
   A<B< int >>::test(bb);         // MQL:2,  should be 1      
   AA::test(bb);                 // MQL:2,  should be 1      
}
 

재미있는 문제에 봉착했습니다. 여러 매개변수 유형이 있는 템플릿 유형을 매크로에 전달할 수 없습니다. 전처리기가 템플릿을 처리하고 있다는 사실을 모르고 쉼표로 매개변수를 계산하기 때문입니다.

SO 에서 C++에 대한 문제 및 솔루션에 대한 설명을 찾았습니다.

 #define COMMA ,
#define XYZ(type) {type ptr;}

XYZ(TemplatedType<A COMMA B>); // ошибка

MQL을 시도했지만 불행히도 작동하지 않습니다. 컴파일러는 전달된 유형에서 설명하는 변수에 대해 "선언되지 않은 식별자" 오류를 제공합니다.

지금까지 파생 클래스를 추가로 관리했는데 C++처럼 고칠 수 있나요?

죄송합니다. 해결책을 찾았습니다. 작동 방식은 다음과 같습니다.

 #define COMMA() ,
질문이 제거되었습니다.
Passing a template type into a macro
Passing a template type into a macro
  • 2017.05.30
  • bitmaskbitmask 22.3k1111 gold badges7070 silver badges133133 bronze badges
  • stackoverflow.com
I have a macro that takes a number of arguments, one of which is a type. For instance: If I try to instantiate this with a template type, say: This will not work as intended, as the pre-processor knows nothing of templates. It will...
 

MT5 버그(빌드 2367) 오버로드된 템플릿 함수의 위치가 컴파일 결과에 영향을 줍니다.
작업이 수행된 초기 티켓 - https://www.mql5.com/ru/forum/1111/page2655#comment_15119627
C++ 온라인( https://onlinegdb.com/BJzbH2DLL ).


 class input_iterator_tag  {};
class forward_iterator_tag       : public input_iterator_tag         {};
class bidirectional_iterator_tag : public forward_iterator_tag       {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};


template < typename _Iterator, typename _Tp>
_Iterator set_value( const _Iterator &it,  _Tp &value, const   forward_iterator_tag*  tag){
   printf ( "2\r\n" );
   return set_value(it, value, (input_iterator_tag*) NULL );                 // 'set_value' - ambiguous call to overloaded function         
};

template < typename _Iterator, typename _Tp>
_Iterator set_value( const _Iterator &it,  _Tp &value, const   bidirectional_iterator_tag*  tag){
   printf ( "3\r\n" );
   return set_value(it, value, (forward_iterator_tag*) NULL );
};

template < typename _Iterator, typename _Tp>
_Iterator set_value( const _Iterator &it,  _Tp &value, const random_access_iterator_tag* tag){
   printf ( "4\r\n" );
   return set_value(it, value, (bidirectional_iterator_tag*) NULL );
};

template < typename _Iterator, typename _Tp>
_Iterator set_value( const _Iterator &val,  _Tp &value, const input_iterator_tag* tag){
   printf ( "1\r\n" );
   return val;
};


template < typename _Iterator, typename _Tp>
_Iterator set_value( const _Iterator &it, _Tp &value){
   return set_value(it, value, it.tag);                        
};


template < typename T>
struct A{
   T data;
   static random_access_iterator_tag* tag;
};

template < typename T>
random_access_iterator_tag* A::tag = NULL ;

class B{};


void OnStart (){ 
   A<B*> it;
   const B* const b_ptr = new B();
   set_value(it, b_ptr);                                      
   
   A< int > it_int;
   const int value_int = 5 ;
   set_value(it, value_int);         
}

int main(){
   OnStart ();
   return 0 ;
};
 

템플릿 함수/클래스 캐시의 결함:
( MT5(build 2368)에 의해 수정 됨) *** ( up ) 정의되지 않은 동작, 내부 유형 "C"로 복잡한 다중 래핑된 개체를 생성하고 완전히 다른 데이터 유형, 아마도 "B"로 판명되었습니다. 아마도 "int", 원하는 것이 무엇이든 ...
( MT5(build 2368)에 의해 수정 됨) * 컴파일 오류, 함수 포인터 인수를 const ref 템플릿 인수로 전달할 때 발생하는 버그.
( MT5(build 2368)에 의해 수정 됨) * 컴파일 오류, B<void*> 개체 뒤에 B<int> 개체가 생성될 수 있지만 이전에 완료되면 컴파일 오류가 발생합니다.


템플릿 기능/클래스 작업의 결함:
( MT5(build 2368)에 의해 수정 됨) *** ( up ) 템플릿 함수 내부의 버그인 컴파일 오류, 명시적 캐스트 작업의 일부로 전달된 포인터는 포인터처럼 다른 경우에는 클래스처럼 작동합니다.
( MT5(build 2368)에 의해 수정 됨) ** ( up ) 템플릿 함수의 템플릿 매개변수에 대한 내부 클래스에 액세스하려고 할 때 발생하는 컴파일 오류, 버그.
(MT5(빌드 2368)로 수정되지 않음 ) *** 컴파일 오류, 부적절한 경고 출력에 대한 주요 불만은 "사용되지 않는 동작, 향후 MQL 컴파일러 버전에서 숨겨진 메소드 호출이 비활성화됩니다"입니다. 현재 구현은 참새에 대포 사격입니다.
( MT5(build 2368)에 의해 수정되지 않음 ) ** 컴파일 오류, 반환 값이 템플릿 함수 인수의 유형에 따라 매개 변수 유형이 지정된 템플릿 클래스 내부에 있는 내부 클래스인 경우 버그가 템플릿 함수의 반환 값에 영향을 미칩니다. .
(MT5(build 2368)에서 수정되지 않음 ) ** 상속 및 내부 클래스에서 동일한 클래스 이름을 사용하는 경우 기본 클래스를 호출할 때 템플릿 생성자의 네임스페이스 및 범위와 관련된 컴파일 오류, 버그.
(MT5(빌드 2368)에 의해 수정되지 않음 ) * 컴파일 오류, 오버로드된 비 템플릿 함수에서 호출이 수행될 때 명시적 인수 유형으로 템플릿 함수를 호출할 때 발생하는 버그.
(MT5(빌드 2368)로 수정되지 않음 ) 컴파일 오류, 내부 클래스 정의 시 버그 - 기본 클래스를 지정할 때 전역 네임스페이스를 명시적으로 참조할 수 없습니다.
(MT5(빌드 2368)에 의해 수정 됨) ** 내부 클래스를 사용할 때 컴파일 오류, 템플릿 클래스 코드 생성 버그.
( MT5(build 2368)에 의해 수정 됨) * 컴파일 오류, 템플릿 메서드/클래스 생성 시 버그, 템플릿 매개변수의 "자동 교체" 프로세스가 범위를 넘어 메인 프로그램 코드로 넘어갑니다.
( MT5(build 2368)에 의해 수정 됨) * 템플릿 클래스가 템플릿 메서드의 반환 값으로 작동할 때 템플릿 클래스 코드가 자동으로 생성되지 않는 버그인 컴파일 오류.
( MT5(build 2368)에 의해 수정 됨) * 컴파일 오류, 템플릿 함수에 내부 구조체를 전달할 때 발생하는 버그, 결과 데이터 형식은 템플릿 클래스의 다른 내부 구조체에 대한 기본 데이터 형식으로 사용할 수 없습니다.
( MT5(빌드 2368)로 수정 ) * 템플릿 클래스 내에서 템플릿 함수를 선언할 때 재사용된 템플릿 유형 이름을 확인하지 않아 예기치 않은 동작이 발생하는 컴파일 오류.
(MT5(빌드 2368)에 의해 수정 됨) 컴파일 오류, 개체가 템플릿 클래스/구조체일 때 "제자리에서 생성된" 개체 반환과 관련된 많은 버그.
( MT5(build 2368)에 의해 수정되지 않음 ) * (버그가 아니라 기능입니다) 기본 클래스 생성자에서 명시적 유형 변환을 수행하여 기본 클래스 개체에 대한 포인터를 부모 클래스.


C++와 비교하여 MQL에서 오버로드된 함수 호출 우선순위의 불일치와 관련된 결함:
( MT5(build 2368)에 의해 수정 됨) ** ( up ) 컴파일 오류, 오버로드된 템플릿 함수에 대한 호출의 우선순위는 실제로 템플릿 매개변수의 유형에 따라 달라지며 이론상 컴파일 결과에 어떤 영향도 주어서는 안 됩니다.
( MT5(build 2368)에 의해 수정 됨) ** ( up ) 오버로드된 템플릿 함수 중 첫 번째가 완전히 특수화된 템플릿 기본 클래스를 사용하고 두 번째 템플릿이 비특수화된 템플릿 기본 클래스를 사용할 때 컴파일 오류가 발생합니다.
( MT5(빌드 2368)로 수정되지 않음 ) ** 컴파일 오류, 템플릿 함수 코드 생성 시 전달된 매개 변수에 적합한 서명을 가진 오버로드된 템플릿 함수가 있음에도 불구하고 컴파일 오류가 발생합니다.
(MT5(빌드 2368)에 의해 수정되지 않음 ) * 템플릿 매개변수의 수가 다른 오버로드된 템플릿 함수를 호출할 때 컴파일 오류, "오버로드된 함수에 대한 모호한 호출"이 발생합니다.
( MT5(빌드 2368)에 의해 수정 됨) *** 컴파일 오류, 클래스 A <= B <= C <= D의 상속이 있고 두 개의 오버로딩 기능이 구현되는 경우(예: 매개변수 A* 및 두 번째 B*를 사용하는 경우 MQL에서 C* 또는 D* 객체의 이러한 함수에 전달하면 "모호 오버로드된 함수 호출" 컴파일 오류가 발생합니다.
( MT5(빌드 2368)에 의해 수정 됨) ** 런타임, 오버로드된 템플릿 함수 호출에 대한 우선 순위 불일치.

기능의 느린 실행과 관련된 결함, 코드 최적화 프로그램의 작업:
( MT5(빌드 2368)에 의해 수정 됨) ** 런타임, ArrayResize를 사용하여 하나의 요소를 배열에 추가할 때 큰 오버헤드가 발생합니다. 예를 들어 최대 7배 느린 구조의 경우 해당 메모리가 미리 예약되어 있음에도 불구하고.


제안:
(신규) 링크 - 클래스의 정적 메서드에 대한 Intellisense 작업을 기반으로 하는 네임스페이스 기능에 대한 Intellisense 지원 구현에 대해 설명합니다.
링크 - 리터럴 및 임시 변수를 const ref 함수 인수로 전달하는 기능 제공에 대해.
링크 - "프로젝트" 탭에서 프로젝트 파일을 이동할 때 열려 있고 ME 탭에 있는 파일을 이동하려면 위치 경로를 자동으로 업데이트합니다.
링크 - MQL typedef 선언에 기능을 도입해야 할 필요성에 대해.
링크 - 기본 복사 생성자 및 할당 연산자 생성을 강제하는 기능 제공에 대해.

 
템플릿 매개변수가 기본 클래스인 경우 템플릿 클래스에서 상속할 때 기본 액세스 한정자 를 사용할 때 MT5 버그(빌드 2368) 컴파일 오류가 발생합니다.
이전에는 모든 것이 제대로 작동했으며 분명히 다른 결함을 수정하는 과정에서 문제가 발생했습니다.

 class A{};

template < typename T>
class B : T{};             // 'A' - unexpected token       

template < typename T>
class BB : private T{};

   
void OnStart (){    
   BB<A> bb;       // Ok
   B<A> b;         // Compile Error: 
}
 

기본 클래스의 명시적 표시를 통해 할당 연산자를 호출할 때 MT5 버그(빌드 2368) 컴파일 오류가 발생 했습니다. 템플릿 매개변수가 기본 클래스인 템플릿 클래스에 대해 문제가 나타납니다.
이전에는 모든 것이 제대로 작동했으며 분명히 다른 결함을 수정하는 과정에서 문제가 발생했습니다.

 struct A{
   uchar data;
   void operator =( int n){
       printf ( "1" );
   }
};

template < typename T>
struct B : public T{
   void operator =( int n){
      T:: operator =(n);     // 'operator' - undeclared identifier  
   }
};

   
void OnStart (){    
   B<A> b;        
   b = 0 ;
}
 
2020년 3월 8일부터 MT5 업데이트에 대해 모두에게 알리십시오. 거래 내역이 급증하기 시작했습니까?
파일:
 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

fxsaber , 2020.03.22 10:04

mq5 - 정상. mq4 - 고장났습니다. 여기에서 TypeToBytes_ExampleScript.mq4를 가져올 수 있습니다. 확장자가 mq5로 변경된 경우에만 컴파일됩니다.

2368 - 아무것도 변경되지 않았습니다.

 

하나의 MT5 터미널을 통해 나는 항상 모든 브로커의 계정에 로그인할 수 있었습니다. 첫 번째 항목에 문제가 있는 경우 터미널을 사용하여 적절한 브로커를 검색하기만 하면 자동으로 거래 서버에서 데이터를 수신합니다. 그 후에는 문제 없이 즉시 로그인할 수 있었습니다.


오늘 처음으로 아무것도 도움이되지 않는 상황 (새로운 브로커)에 직면했습니다. 들어오지마 로그에 씁니다.

2020.03.25 09:50:33.538  'xxx': no connection to XXX-Server


브로커의 기본 터미널을 다운로드합니다. 그리고 내 연구 터미널 - 모든. 이런 건 처음이야.

네이티브가 아닌 터미널이 거래 계정에 연결할 수 있도록 만드는 방법을 알려주십시오.

 
fxsaber :

네이티브가 아닌 터미널이 거래 계정에 연결할 수 있도록 만드는 방법을 알려주십시오.

MT4에서는 거래 서버가 검색되지 않도록 server.ini 서버 파일을 다른 터미널에 복사해야 했습니다.

나는 mt5에 대해 모른다