템플릿 매개변수가 있는 컴파일러 버그 = void*

 

컴파일러 오류입니다. 빌드 1961, 64비트.

 template < typename T>
class A
{ 
};

A< void *> a;   // '<' - cannot to apply function
 
예전에는 가능했나요?
 
저녁에는 C ++에서 이러한 선언을 사용하여 방법을 확인할 것입니다.
 
Vladimir Simakov :
예전에는 가능했나요?

네. 이전 빌드(1554)에서 특별히 확인했습니다. 모든 것이 작동합니다.

저녁에는 C ++에서 이러한 선언을 사용하여 방법을 확인할 것입니다.

글쎄, 모든 것이 거기에 있습니다. 이것이 작동하지 않을 수 있는 이유가 있습니까?
 
Alexey Navoykov :

이 구성을 사용하는 예를 제공하십시오.

 
fxsaber :

이 구성을 사용하는 예를 제공하십시오.

가장 평범한 예는 배열 클래스입니다. 이 경우 포인터를 저장하는 데 사용됩니다.

 template < typename T>
class CArray
{
  T _data[]; 
 public :
  T operator []( int i) const { return _data[i]; }
   int Size()           const { return ArraySize (_data); }
   // и т.д.
};

СArray< void *> pointers;
 
Alexey Navoykov :

가장 평범한 예는 배열 클래스입니다. 이 경우 포인터를 저장하는 데 사용됩니다.

그럼 어떻게 사용할까요?

 class A
{
public :
   void OnInit ()
  {
     Print ( __FUNCSIG__ );
  }
};

class B
{
public :
   void OnInit ()
  {
     Print ( __FUNCSIG__ );
  }
};

void OnStart ()
{    
   void * Pointers[ 2 ];

  A a;
  B b;
  
  Pointers[ 0 ] = &a;
  Pointers[ 1 ] = &b;
  
   for ( int i = 0 ; i < ArraySize (Pointers); i++)
    Pointers[i]. OnInit (); // 'OnInit' - member function not defined
}
 
fxsaber :

그럼 어떻게 사용할까요?

예를 들어 메타 인용 컨테이너에서 CObject 를 사용하는 것과 정확히 동일합니다. 원래 거기에 넣은 유형으로 캐스트합니다(또는 dynamic_cast를 통해 확인). 당신에게서 그런 질문을 듣는 것은 조금 의외입니다.
 
Alexey Navoykov :
원래 거기에 넣은 유형으로 캐스트합니다(또는 dynamic_cast를 통해 확인).
 //    (A*)Pointers[i].OnInit();
    ((A*)Pointers[i]). OnInit ();

이것은 대괄호의 필요성/무용성에 관한 것입니다 ... 이러한 캐스팅을 사용하면 실행될 때 위의 스크립트에 오류가 발생합니다. 저것들. 배열 포인터 요소가 참조하는 클래스의 이름을 알아야 합니다.

그런 다음 편의가 무엇인지 파악하지 못했습니다.


MQ는 한 곳에서만 void*를 사용합니다.

 typedef string (*DoubleToStringFunction)( double , void *);
 
fxsaber :

MQ는 한 곳에서만 void*를 사용합니다.

CObject 에 모든 것이 구축되어 있기 때문입니다. 그리고 이것은 클래스에서 상속되지 않은 자체 클래스 및 인터페이스에 대해 컨테이너를 사용하는 것을 불가능하게 만듭니다. 저것들. 보편적인 솔루션이 아닙니다.

아마도 이것은 라이브러리 생성 당시 MQL에 void*가 없었기 때문일 것입니다. 반면에 객체 자체는 그 자체로 단순히 야생인 일부 조작(포인터 값이 변경됨)에도 참여합니다.

 
Alexey Navoykov :

CObject에 모든 것이 구축되어 있기 때문입니다. 그리고 이것은 클래스에서 상속되지 않은 자체 클래스 및 인터페이스에 대해 컨테이너를 사용하는 것을 불가능하게 만듭니다. 저것들. 보편적인 솔루션이 아닙니다.

아마도 이것은 라이브러리 생성 당시 MQL에 void*가 없었기 때문일 것입니다.

불행히도 나는 사용 예를 보지 못했습니다.