Şablon parametreli derleyici hatası = void*

 

Derleyici hatası. 1961, 64 bit oluşturun.

 template < typename T>
class A
{ 
};

A< void *> a;   // '<' - cannot to apply function
 
Daha önce mümkün müydü?
 
Akşam C ++ 'da böyle bir beyanla nasıl kontrol edeceğim
 
Vladimir Simakov :
Daha önce mümkün müydü?

Evet. Eski yapı (1554) üzerinde özel olarak kontrol edildi - her şey çalışıyor.

Akşam C ++ 'da böyle bir beyanla nasıl kontrol edeceğim

Her şey yolunda. Bunun işe yaramaması için herhangi bir sebep var mı?
 
Alexey Navoykov :

Lütfen bu yapıyı kullanmanın bir örneğini sağlayın.

 
fxsaber :

Lütfen bu yapıyı kullanmanın bir örneğini sağlayın.

En banal örnek dizi sınıfıdır. Bu durumda, herhangi bir işaretçiyi saklamak için kullanılır:

 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 :

En banal örnek dizi sınıfıdır. Bu durumda, herhangi bir işaretçiyi saklamak için kullanılır.

O zaman nasıl kullanılır?

 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 :

O zaman nasıl kullanılır?

Eh, örneğin metaquotes kapsayıcılarında CObject kullanmakla tamamen aynı. Orijinal olarak oraya koyduğunuz türe yayın yaparsınız (veya dynamic_cast aracılığıyla kontrol edersiniz). Sizden böyle bir soru duymak biraz beklenmedik.
 
Alexey Navoykov :
Orijinal olarak oraya koyduğunuz türe yayın yaparsınız (veya dynamic_cast aracılığıyla kontrol edersiniz).
 //    (A*)Pointers[i].OnInit();
    ((A*)Pointers[i]). OnInit ();

Bu sadece parantezlerin gerekliliği / işe yaramazlığı ile ilgili ... Böyle bir döküm ile, çalıştırıldığında yukarıdaki komut dosyasında bir serseri olacaktır. Onlar. dizi işaretçi öğeleri tarafından başvurulan sınıfların adlarını bilmeniz gerekir.

O zaman rahatlığın ne olduğunu anlamadım.


MQ yalnızca tek bir yerde void* kullanır.

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

MQ yalnızca tek bir yerde void* kullanır.

Çünkü CObject üzerine inşa edilmiş her şeye sahipler. Ve bu, onların kapsayıcılarını kendi sınıfları ve sınıflarından miras alınmayan arayüzler için kullanmayı imkansız hale getirir. Onlar. evrensel bir çözüm değil.

Belki de bu, kitaplıklarının oluşturulduğu sırada MQL'de henüz boşluk* olmamasından kaynaklanmaktadır. Öte yandan, nesnenin kendisi de kendi içinde vahşi olan bazı manipülasyonlara (içindeki işaretçilerin değerleri değişir) katılır.

 
Alexey Navoykov :

Çünkü CObject üzerine inşa edilmiş her şeye sahipler. Ve bu, kapsayıcılarını kendi sınıfları ve sınıflarından miras alınmayan arabirimler için kullanmayı imkansız hale getirir. Onlar. evrensel bir çözüm değil.

Belki de bu, kitaplıklarının oluşturulduğu sırada MQL'nin henüz geçersiz* olmamasından kaynaklanmaktadır.

Maalesef bir kullanım örneği görmedim.