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

 
fxsaber :

하나는 생성 중입니다. 또한 f에서는 T를 사용할 수 없습니다 .

이것은 그 자체로 실수입니다.
 template < typename T>
void f() { Print ( sizeof ( T )); }
struct A { int a; };
void OnStart ()
{
        f< int >(); //(1)//нормально
        f<A>();   //(2)//нормально
struct B { int b; };
        f<B>();   //(3)//Error: 'B' - undeclared identifier
}
그리고 (1)(2)와 (3)의 근본적인 차이점은 무엇입니까???
 
fxsaber :

게다가, f에서 T를 사용할 수 없습니다. 일반적으로 상황은 나에게 분명합니다.

게다가, 나는 f에서 T를 사용하는 것에 대한 당신의 금지를 위반했습니다.

 template < typename T>
void f() { class T ; Print ( __FUNCSIG__ , ":" , sizeof ( T )); }
template < typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart ()
{
class A {};
        g<A, int    >();
        g<A, double >();
}

보시다시피 오류없이 컴파일되지만 결과가 터무니없다는 사실은 중요하지 않습니다. 중요한 것은 모든 것이 "설명 가능"하다는 것입니다.

 
안녕하세요. 돕다. 나는 금 거래를 할 수 없으며 모든 것이 작동합니다. 즉, 거래를 할 수 없습니다. 다음은 그것이 어떻게 생겼는지에 대한 스크린샷입니다.
 

이 코드의 신성한 의미는 무엇입니까? 왜 표준 라이브러리 에 밀어 넣었습니까?

   if ( IsStopped ( __FUNCTION__ ))
       return ( false );

이제 예를 들어 REASON_REMOVE를 사용하여 OnDeinit의 표준 라이브러리에서 포지션 또는 주문을 마감하는 기능을 사용할 수 없습니다.

 
Stanislav Dray :

이 코드의 신성한 의미는 무엇입니까? 왜 표준 라이브러리 에 밀어 넣었습니까?

이제 예를 들어 REASON_REMOVE를 사용하여 OnDeinit의 표준 라이브러리에서 포지션 또는 주문을 마감하는 기능을 사용할 수 없습니다.

네, 버그입니다.

 
A100 :

게다가, 나는 f에서 T를 사용하는 것에 대한 당신의 금지를 위반했습니다.

보시다시피 오류없이 컴파일되지만 결과가 터무니없다는 사실은 중요하지 않습니다. 중요한 것은 모든 것이 "설명 가능"하다는 것입니다.

템플릿이 무엇인지 잘 이해하지 못하고 있습니다. 그리고 그것들은 일부 칩만 있는 매크로와 유사합니다.

다음은 코드입니다.

 template < typename T>
void f() { class T{ MqlTick a; }; Print ( __FUNCSIG__ , ":" , sizeof (T) ); }
template < typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart ()
{
class A {};
        g<A, int    >();
        g<A, double >();
}

발행할 것이다

void f < A > (): 68
void f < A > (): 68

T는 매크로에서와 같이 기본이기 때문에 몇 가지 주의 사항이 있습니다. 결과적으로 서명이 생성되고 있습니다. 함수 내에서 아무도 함수에서 T를 대체하는 A에 대해 알지 못합니다. 그러나 이 A를 내부적으로 정의하므로 더 이상의 컴파일 오류 가 발생하지 않습니다. 이 A가 같은 이름의 다른 클래스와 아무 관련이 없음을 보여주기 위해 내부에 MqlTick을 삽입했습니다.

즉, MQL5의 내부 기능 클래스는 상위 기능 외부에서 볼 수 없습니다. T로 유형의 이름만 클래스로 전달됩니다. 동시에 제목에는 부모 기능에 대한 언급이 없습니다.

저것들. 모든 것이 꽤 논리적입니다. 이것은 버그가 아니라 제한된 구현입니다.


추신 아마 인터뷰에서 C ++ 프로그래머는 이것이 불가능하다고 말할 것입니다

 template < typename T>
void f() { class T{}; }


MQL5 - 꽤.

 
fxsaber :

템플릿이 무엇인지 잘 이해하지 못하고 있습니다.

fxsaber :

추신 아마 인터뷰에서 C ++ 프로그래머는 이것이 불가능하다고 말할 것입니다

이것이 C ++에서 불가능하다고 생각한다면 그것은 내가 아니라는 것을 의미하지만 템플릿이 무엇인지 어떻게 작동하는지 이해하지 못합니다 ... 특히 조잡한 구현과 제한된 구현을 구별 할 수 없기 때문에

 
A100 :

이것이 C ++에서 불가능하다고 생각한다면 그것은 내가 아니라는 것을 의미하지만 템플릿이 무엇인지 어떻게 작동하는지 이해하지 못합니다 ... 특히 조잡한 구현과 제한된 구현을 구별 할 수 없기 때문에

댓글을 달고 있는 문장의 첫 단어를 읽으십시오. MQL5의 템플릿과 매크로에 대한 나의 이해는 컴파일을 시도하지 않고는 예제가 MQL5에서 컴파일되지 않는다는 것을 깨닫는 것과 같습니다. ++로 - 방해하지 않는 것이 무엇인지 모르겠습니다.


추신: 그들이 이 코드에 대한 C++의 반응을 보여주면 감사하겠습니다.

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

오류, 버그, 질문

fxsaber , 2018.09.03 07:16

추신 아마 인터뷰에서 C ++ 프로그래머는 이것이 불가능하다고 말할 것입니다

 template < typename T>
void f() { class T{}; }
 
fxsaber :

추신: 그들이 이 코드에 대한 C++의 반응을 보여주면 감사하겠습니다.

반응은 MQL과 동일합니다. 왜 그녀는 달라야 합니까? 그는 패턴과 아프리카 패턴
 
fxsaber :

템플릿이 무엇인지 잘 이해하지 못하고 있습니다. 그리고 일부 칩만 있는 매크로와 유사합니다.

예, 플러스에 대한 그러한 예는 컴파일되지 않습니다.

 오류: 'struct f()::T'의 선언은 템플릿 매개변수 템플릿<typename T>을 그림자로 만듭니다.

하지만 컴파일이 되더라도 클래스 이름은 "T"일 것이기 때문에 결과는 당신을 놀라게 할 것입니다.

 mql이 다르면 잘못된 것입니다.