특히 다음과 같이 특정 부정확성을 도입 하여 코드 를 최소한으로 단순화한 점에 대해 사과드립니다. - 함수에 전달된 객체의 크기가 동일합니다(코드가 업데이트됨). - 어리석은 출력 대신 printf("1");/printf("2"); 실제로 인터페이스 또는 객체 내부에 대한 액세스는 직접 수행되며, 이는 차례로 두 개의 알고리즘을 단일 호출 함수로 인라인하는 것을 가능하게 하지 않습니다(코드 업데이트됨).
특히 다음과 같이 특정 부정확성을 도입 하여 코드 를 최소한으로 단순화한 점에 대해 사과드립니다. - 함수에 전달된 객체의 크기가 동일합니다(코드가 업데이트됨). - 어리석은 출력 대신 printf("1");/printf("2"); 실제로 인터페이스 또는 객체 내부에 대한 액세스는 직접 수행되며, 이는 차례로 두 개의 알고리즘을 단일 호출 함수로 인라인하는 것을 가능하게 하지 않습니다(코드 업데이트됨).
class C{
public :
struct A{
public :
char aaa;
A ( charvalue = 0 ) : aaa( value ){}
voidset ( charvalue ){
aaa = value ;
};
uint Type(){ return0x778F6712 ;}charget (){ return aaa;}
A Get() { returnthis ;}
};
void test(A&, A& a1, A& a2){
printf( "1" );
a1.aaa = a2.aaa;
}
template<typename T>
void test(A& a, T& d1, T& d2){
if (a.Type()== d1.Type()) test(a,d1.Get(),d2.Get());else {
printf( "2" );
d1. set (d2. get ());}
}
};
struct B : public C::A{};
struct D{
private :
char data;
public :
D( charvalue = 0 ) : data( value ){}
voidset ( charvalue ){
data = value ;
};
uint Type(){ return0x308FD7FE ;}charget (){ return data;}
D Get() { returnthis ;}
};
void OnStart(){
C c;
B b;
D d;
c.test(b, b, b); // 1 should be: 1
c.test(b, d, d); // 2 should be: 2
}
또는 다음과 같이:
class C{
public :
struct A{
public :
char aaa;
A ( charvalue = 0 ) : aaa( value ){}
voidset ( charvalue ){
aaa = value ;
};
charget (){ return aaa;}
A Get() { returnthis ;}
};
void test(A&, A& a1, A& a2){
printf( "1" );
a1.aaa = a2.aaa;
}
template<typename T>
void test(A& a, T& d1, T& d2){
printf( "2" );
d1. set (d2. get ());
}
};
struct B : public C::A{};
struct D{
private :
char data;
public :
D( charvalue = 0 ) : data( value ){}
voidset ( charvalue ){
data = value ;
};
charget (){ return data;}
D Get() { returnthis ;}
};
void OnStart(){
C c;
B b;
D d;
c.test(b .Get() , b .Get() , b .Get() ); // 1 should be: 1
c.test(b .Get() , d .Get() , d .Get() ); // 2 should be: 2
}
템플릿 기능/클래스 캐시 작업의 결함: (MT5(빌드 2345)에 의해 수정 되지 않음) ** 정의되지 않은 동작, 내부 유형 "C"를 사용하여 복잡한 다중 래핑된 개체를 생성하면 완전히 다른 데이터 유형, 아마도 "B", 아마도 " int" 원하는 대로... (MT5(빌드 2345)에 의해 수정되지 않음 ) * 컴파일 오류, 함수 포인터 인수를 const ref 템플릿으로 전달할 때 발생하는 버그. (MT5(빌드 2345)로 수정되지 않음 ) * 컴파일 오류, B<void*> 개체 뒤에 B<int> 개체가 생성될 수 있지만 이전에 완료되면 컴파일 오류가 발생합니다.
템플릿 기능/클래스 작업의 결함: ( MT5(빌드 2345)에 의해 수정되지 않음 ) ** 컴파일 오류, 템플릿 함수 내부의 버그 , 명시적 캐스트 작업의 일부로 전달된 포인터는 포인터처럼 다른 경우에는 클래스처럼 작동합니다. (MT5(빌드 2345)로 수정되지 않음 ) ** 컴파일 오류, 내부 클래스 사용 시 템플릿 클래스 코드 생성 버그. (MT5(빌드 2345)에 의해 수정되지 않음 ) ** 컴파일 오류, 템플릿 함수의 템플릿 매개변수에 대한 내부 클래스에 액세스하려고 할 때 발생하는 버그. (MT5(빌드 2345)로 수정되지 않음 ) * 컴파일 오류, 템플릿 메서드/클래스 생성 시 버그, 템플릿 매개변수의 "자동 교체" 프로세스가 범위를 넘어 메인 프로그램 코드로 넘어갑니다. (MT5(빌드 2345)에서 수정되지 않음 ) * 컴파일 오류, 템플릿 클래스가 템플릿 메서드의 반환 값으로 작동할 때 템플릿 클래스 코드가 자동으로 생성되지 않는 버그입니다. ( MT5(build 2345)에 의해 수정되지 않음 ) * 컴파일 오류, 내부 클래스 정의 시 버그 - 기본 클래스를 지정할 때 전역 네임스페이스를 명시적으로 참조할 수 없습니다. ( MT5(build 2345)에 의해 수정되지 않음 ) *(new) 컴파일 오류, 내부 구조체를 템플릿 함수에 전달할 때의 버그, 결과 데이터 형식은 템플릿 클래스의 다른 내부 구조체에 대한 기본 데이터 형식으로 사용할 수 없습니다. (MT5(build 2345)에 의해 수정되지 않음 ) *(new) 컴파일 오류, 오버로드된 비 템플릿 함수에서 호출이 이루어질 때 명시적 인수 유형으로 템플릿 함수를 호출할 때 발생하는 버그.
C++와 비교하여 MQL에서 오버로드된 함수 호출의 우선순위 불일치 내 결함: (MT5(빌드 2345)에 의해 수정되지 않음 ) *** 컴파일 오류, 클래스 A <= B <= C <= D의 상속이 있고 두 개의 오버로딩 함수가 구현되는 경우(예: 매개변수 A*가 있는 함수 및 두 번째로 B*를 사용한 다음 MQL에서 이러한 C* 또는 D* 개체의 함수로 전달하면 "모호 오버로드된 함수 호출" 컴파일 오류가 발생합니다. (MT5(빌드 2345)로 수정되지 않음 ) ** 런타임, 오버로드된 템플릿 함수 호출에 대한 우선 순위 불일치. ( MT5(build 2345)에 의해 수정되지 않음 ) **(new) 컴파일 오류, 오버로드된 템플릿 함수에 대한 호출의 우선 순위는 실제로 템플릿 매개변수의 유형에 따라 다르며 이론상 컴파일 결과에 영향을 주어서는 안 됩니다. . ( MT5(build 2345)에 의해 수정되지 않음 ) **(new) 컴파일 오류, 템플릿 함수 코드 생성 시 전달된 매개변수에 적합한 서명을 가진 오버로드된 템플릿 함수가 있음에도 불구하고 컴파일 오류가 발생합니다.
제안: 링크 - 리터럴 및 임시 변수를 const ref 함수 인수로 전달하는 기능 제공에 대해. 링크 - "프로젝트" 탭에서 프로젝트 파일을 이동할 때 열려 있고 ME 탭에 있는 파일을 이동하려면 위치 경로를 자동으로 업데이트합니다. 링크 - MQL typedef 선언에 기능을 도입해야 할 필요성에 대해. 링크 - 기본 복사 생성자 및 할당 연산자 생성을 강제하는 기능 제공에 대해.
MT5 버그(빌드 2345) 개체가 템플릿 클래스/구조일 때 "제자리에서 생성된" 개체 반환과 관련된 많은 결함:
class A{
public :
A( int , int , int ){};
A( const A&){}
A( const A*){}
};
// simple class type
A* test_a_ptr_ptr(){
return &A( 1 , 2 , 3 ); //OK
};
A test_a_class_class(){
return A( 1 , 2 , 3 ); //OK
};
A test_a_ptr_class(){
return &A( 1 , 2 , 3 ); //OK
};
template < typename T>
class B{
public :
B( int &){}
B( long ){}
B( int , int , int ){};
B( const B&){}
B( const A*){}
};
// template class type
B<A*> test_b_class_class(){
B<A*> b( 1 );
int x = 22 ;
return B<A*>(); // Compile Error: ambiguous call to overloaded function with the same parameters: "B(long)" and "B(const A*)"return B<A*>( 1 , 2 , 3 ); // Compile Error: only one argument is acceptable, argument should be castable to intreturn B<A*>(x); // Compile Error: argument is passed by value instead of by reference.return B<A*>((A*) NULL ); // Compile Error: 'int' - invalid cast operation return B<B<B< long >>>( 1 ); // Compile Error: OK, template parameter type does not provide any effort on compilation resultreturn b;
};
B<A*>* test_b_ptr_ptr(){
B<A*> b( 1 );
return &B<A*>( 1 ); // Compile Error: '&' - illegal operation usereturn &b;
};
voidOnStart (){
// simple class type
A* a_ptr = test_a_ptr_ptr();
A a0 = test_a_class_class();
A a1 = test_a_ptr_class();
// template class type
B<A*> b0 = test_b_class_class();
B<A*>* b_ptr = test_b_ptr_ptr();
}
특히 다음과 같이 특정 부정확성을 도입 하여 코드 를 최소한으로 단순화한 점에 대해 사과드립니다.
- 함수에 전달된 객체의 크기가 동일합니다(코드가 업데이트됨).
- 어리석은 출력 대신 printf("1");/printf("2"); 실제로 인터페이스 또는 객체 내부에 대한 액세스는 직접 수행되며, 이는 차례로 두 개의 알고리즘을 단일 호출 함수로 인라인하는 것을 가능하게 하지 않습니다(코드 업데이트됨).
특히 다음과 같이 특정 부정확성을 도입 하여 코드 를 최소한으로 단순화한 점에 대해 사과드립니다.
- 함수에 전달된 객체의 크기가 동일합니다(코드가 업데이트됨).
- 어리석은 출력 대신 printf("1");/printf("2"); 실제로 인터페이스 또는 객체 내부에 대한 액세스는 직접 수행되며, 이는 차례로 두 개의 알고리즘을 단일 호출 함수로 인라인하는 것을 가능하게 하지 않습니다(코드 업데이트됨).
또는 다음과 같이:
사용된 개체의 구조를 변경해야 하고 논리가 번지기 때문에 이상적이지는 않지만 작동합니다.
그리고 예, 테스트보다 래퍼 기능을 만드는 것이 좋습니다.
프로젝트의 모든 호출을 검색하는 방법:
어쨌든 많은 도움을 주셔서 감사합니다.
솔루션 감사합니다
사용된 개체의 구조를 변경해야 하고 논리가 번지기 때문에 이상적이지는 않지만 작동합니다.
그리고 예, 테스트보다 래퍼 기능을 만드는 것이 좋습니다.
프로젝트의 모든 통화를 검색하는 방법:
어쨌든 많은 도움을 주셔서 감사합니다.
그래, 난 동의
템플릿 기능/클래스 캐시 작업의 결함:
(MT5(빌드 2345)에 의해 수정 되지 않음) ** 정의되지 않은 동작, 내부 유형 "C"를 사용하여 복잡한 다중 래핑된 개체를 생성하면 완전히 다른 데이터 유형, 아마도 "B", 아마도 " int" 원하는 대로...
(MT5(빌드 2345)에 의해 수정되지 않음 ) * 컴파일 오류, 함수 포인터 인수를 const ref 템플릿으로 전달할 때 발생하는 버그.
(MT5(빌드 2345)로 수정되지 않음 ) * 컴파일 오류, B<void*> 개체 뒤에 B<int> 개체가 생성될 수 있지만 이전에 완료되면 컴파일 오류가 발생합니다.
템플릿 기능/클래스 작업의 결함:
( MT5(빌드 2345)에 의해 수정되지 않음 ) ** 컴파일 오류, 템플릿 함수 내부의 버그 , 명시적 캐스트 작업의 일부로 전달된 포인터는 포인터처럼 다른 경우에는 클래스처럼 작동합니다.
(MT5(빌드 2345)로 수정되지 않음 ) ** 컴파일 오류, 내부 클래스 사용 시 템플릿 클래스 코드 생성 버그.
(MT5(빌드 2345)에 의해 수정되지 않음 ) ** 컴파일 오류, 템플릿 함수의 템플릿 매개변수에 대한 내부 클래스에 액세스하려고 할 때 발생하는 버그.
(MT5(빌드 2345)로 수정되지 않음 ) * 컴파일 오류, 템플릿 메서드/클래스 생성 시 버그, 템플릿 매개변수의 "자동 교체" 프로세스가 범위를 넘어 메인 프로그램 코드로 넘어갑니다.
(MT5(빌드 2345)에서 수정되지 않음 ) * 컴파일 오류, 템플릿 클래스가 템플릿 메서드의 반환 값으로 작동할 때 템플릿 클래스 코드가 자동으로 생성되지 않는 버그입니다.
( MT5(build 2345)에 의해 수정되지 않음 ) * 컴파일 오류, 내부 클래스 정의 시 버그 - 기본 클래스를 지정할 때 전역 네임스페이스를 명시적으로 참조할 수 없습니다.
( MT5(build 2345)에 의해 수정되지 않음 ) *(new) 컴파일 오류, 내부 구조체를 템플릿 함수에 전달할 때의 버그, 결과 데이터 형식은 템플릿 클래스의 다른 내부 구조체에 대한 기본 데이터 형식으로 사용할 수 없습니다.
(MT5(build 2345)에 의해 수정되지 않음 ) *(new) 컴파일 오류, 오버로드된 비 템플릿 함수에서 호출이 이루어질 때 명시적 인수 유형으로 템플릿 함수를 호출할 때 발생하는 버그.
C++와 비교하여 MQL에서 오버로드된 함수 호출의 우선순위 불일치 내 결함:
(MT5(빌드 2345)에 의해 수정되지 않음 ) *** 컴파일 오류, 클래스 A <= B <= C <= D의 상속이 있고 두 개의 오버로딩 함수가 구현되는 경우(예: 매개변수 A*가 있는 함수 및 두 번째로 B*를 사용한 다음 MQL에서 이러한 C* 또는 D* 개체의 함수로 전달하면 "모호 오버로드된 함수 호출" 컴파일 오류가 발생합니다.
(MT5(빌드 2345)로 수정되지 않음 ) ** 런타임, 오버로드된 템플릿 함수 호출에 대한 우선 순위 불일치.
( MT5(build 2345)에 의해 수정되지 않음 ) **(new) 컴파일 오류, 오버로드된 템플릿 함수에 대한 호출의 우선 순위는 실제로 템플릿 매개변수의 유형에 따라 다르며 이론상 컴파일 결과에 영향을 주어서는 안 됩니다. .
( MT5(build 2345)에 의해 수정되지 않음 ) **(new) 컴파일 오류, 템플릿 함수 코드 생성 시 전달된 매개변수에 적합한 서명을 가진 오버로드된 템플릿 함수가 있음에도 불구하고 컴파일 오류가 발생합니다.
제안:
링크 - 리터럴 및 임시 변수를 const ref 함수 인수로 전달하는 기능 제공에 대해.
링크 - "프로젝트" 탭에서 프로젝트 파일을 이동할 때 열려 있고 ME 탭에 있는 파일을 이동하려면 위치 경로를 자동으로 업데이트합니다.
링크 - MQL typedef 선언에 기능을 도입해야 할 필요성에 대해.
링크 - 기본 복사 생성자 및 할당 연산자 생성을 강제하는 기능 제공에 대해.
Sergey Dzyublik :
Спасибо за вариант решения
임시 사본은 참조로 전달되므로 구조 변경이 작동하지 않습니다.
임시 사본은 참조로 전달되므로 구조 변경이 작동하지 않습니다.
일반적으로 당신이 옳습니다 ...
그러나 사적으로는 모든 것이 훨씬 더 복잡하며 실제로 주어진 구조는 반복자 포인터 이며 변경되는 내용이 아니라 참조하는 객체입니다.
따라서 특별한 경우에는 문제가 해결되고 이에 대해 감사가 표현됩니다.
거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼
오류, 버그, 질문
Sergey Dzyublik , 2020.03.01 12:53
이 함수가 존재하지 않는 객체에 대한 포인터를 반환한다는 것을 정확히 이해하고 있습니까?
이 함수가 존재하지 않는 객체에 대한 포인터를 반환한다는 것을 정확히 이해하고 있습니까?
예, 위의 예에서 함수는 존재하지 않는 개체에 대한 포인터를 반환합니다.
이 코드의 주요 목적은 간단한 클래스에 대한 작동 기능의 존재와 동시에 템플릿 클래스에 대한 실제 부재를 보여주는 것입니다.