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

 

다음과 같이 간단한 유형과 포인터를 별도로 처리해야 할 때 "모호 오버로드된 함수 호출" 오류를 해결할 수 있는 깔끔한 방법이 있는지 상기시켜 주십시오.

     template < typename V>
     void process(V value)
    {
    }

     void process(BaseFunctor *ptr)
    {
    }

여기에서 컴파일러는 (BaseFunctor *)도 V와 일치한다고 생각합니다. 메서드를 호출할 때 명시적으로 형변환을 입력 할 수 있지만 이것은 보기 흉합니다. 템플릿 함수가 참조로 매개변수를 수락하면 상수 및 기타 임시 값을 전달할 수 없습니다(변수가 필요함).

 
Stanislav Korotky :
링크로 오버로드를 추가해 보세요.
 
TheXpert :
링크로 오버로드를 추가해 보세요.

개체 참조 또는 포인터 참조(존재하지 않는 것 같습니다)를 사용하여 오버로드하는 것을 의미합니까? new를 통해 배포된 인스턴스에 대한 포인터를 개체에 대한 참조로 밀어 넣는 방법을 모르겠습니다.

 
Artyom Trishkin :

당신의 사이클은 포지션을 닫기 에 적합하지 않습니다. 역 사이클을 수행하십시오.

Artyom Trishkin :

당신의 사이클은 포지션을 닫기 에 적합하지 않습니다. 역 사이클을 수행하십시오.

시도해 보겠습니다. 그러나 한 방향에서 모든 수익성 있는 포즈를 찾고 있는 경우 정렬하는 방법은 모두 동일하지 않습니까? 어쨌든 우리는 모든 것을 정리하고 필요한 것을 닫을 것입니다.

 
Stanislav Korotky :

개체 참조 또는 포인터 참조(존재하지 않는 것 같습니다)를 사용하여 오버로드하는 것을 의미합니까? new를 통해 배포된 인스턴스에 대한 포인터를 개체에 대한 참조로 밀어 넣는 방법을 모르겠습니다.

개체를 참조하여.

나는 그렇게 가지고있다 :

 class C {};

template < typename V>
void process(V value)
{
}

/* если добавить, компилируется
template<typename V>
void process(V& value)
{
}
*/

void process(C *ptr)
{
}
    
void OnStart ()
  {
      C c;
      process(&c); // pointer, ok
      process(c); // 'process' - no one of the overloads can be applied to the function call       test2.mq5       32      7
  }
 
TheXpert :

개체를 참조하여.

나는 그렇게 가지고있다 :

여전히 간단하지 않습니다. 죄송합니다 ;-). 클래스는 상속에 사용됩니다.

 class BaseFunctor
{
   public :
     virtual void process() = 0;
};

class MyFunctor: public BaseFunctor
{
   public :
     virtual void process() override
    {
    }
};

template < typename V>
void process(V value)
{
}

void process(BaseFunctor *ptr)
{
}

void process(BaseFunctor &ref)
{
}

void OnStart ()
{
  process( new MyFunctor()); // 'process' - ambiguous call to overloaded function, could be one of 3 function(s)
}

BaseFunctor를 생성할 수 있다면 작동할 것입니다. 그렇습니다. 그러나 이것은 사실이 아닙니다.

 
Pavel Kozlov :

안녕하세요!

버그를 신고해 주셔서 감사합니다!

그림의 문제를 더 자세히 설명할 수 있습니까?

현재 문제 없음

 

아래 코드는 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र를 출력합니다.

그리고 텍스트 테스트를 표시해야 합니다.

파일은 Files\\Test\\ 폴더에 있습니다.

함수는 핸들이 정확하다고 기록하고 1과 같으며 즉시 GetLastError 가 오류 5008 Invalid handle ....를 기록합니다.

어디서 파나요?

 //+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   core();
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {

  }
//+------------------------------------------------------------------+
void core()
  {
   string value = "" , name = "" ;

   name =   "Test" + "\\test.csv" ;
   Print ( FileIsExist (name));

   ResetLastError ();

   int m_hendle = - 1 ;
   m_hendle = FileOpen (name, FILE_READ | FILE_WRITE | FILE_CSV );
   if (m_hendle != INVALID_HANDLE )
     {
       Print (( string )m_hendle + "    " + name + " [" + ( string ) FileSize (m_hendle) + "]" + ( string ) GetLastError ());
       while (! FileIsEnding (m_hendle))
        {
         string sCurrent = FileReadString (m_hendle);
         Print ( "sCurrent = " , sCurrent);
        }
       FileClose (m_hendle);
     }
  }
//+------------------------------------------------------------------+
 
Sergey Dzyublik :
매우 불쾌한 MT5(빌드 2316) 버그가 추가 개발을 차단합니다.
내부 유형 "C"로 여러 번 래핑된 복잡한 객체를 생성하면 완전히 다른 데이터 유형 , 아마도 "B", 아마도 "int", 원하는 것이 무엇이든 ...

문제가 코드에 있는 것이 아니라 MQL 컴파일러의 작업에 있다는 것을 파헤치고 이해하는 데 많은 시간과 노력을 기울였습니다. (C++ 온라인: https://onlinegdb.com/H1R1fR5ML )
아마도 문제는 컴파일 타임에 코드를 생성할 때 템플릿 클래스 "main_wrapper"의 캐시에 있고 내부 클래스 "internal_wrapper"가 다양한 데이터 유형(int, B*, 나, 다).
어떤 첫 번째 데이터 유형이 템플릿 클래스 "main_wrapper<A<TEMPLATE_TYPE>::internal_wrapper>에 의해 생성될 것이며, 이 데이터 유형은 향후 이 템플릿의 모든 개체에서 추가로 사용될 것입니다.


템플릿 클래스 코드 생성과 관련된 또 다른 버그는 아래에 제공됩니다.

올려주셔서 감사합니다 수정했습니다

 
Vladimir Pastushak :

아래 코드는 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र를 출력합니다.

그리고 텍스트 테스트를 표시해야 합니다.

파일은 Files\\Test\\ 폴더에 있습니다.

함수는 핸들이 정확하다고 기록하고 1과 같으며 즉시 GetLastError가 오류 5008 Invalid handle ....를 기록합니다.

어디서 파나요?

파일이 어떤 인코딩으로 되어 있습니까?