Error del compilador con el parámetro de la plantilla = void*

Alexey Navoykov  

Error de compilación. Bild 1961, 64 bits.

template<typename T>
class A
{ 
};

A<void*> a;  // '<' - cannot to apply function
Alexey Navoykov  
Vladimir Simakov:
¿Era posible antes?

Sí, lo he comprobado especialmente en la versión antigua (1554) y todo funciona.

Lo comprobaré esta noche con dicho anuncio en C++.

Bueno, ciertamente está bien allí. ¿Hay alguna razón para que no funcione?
fxsaber  
Alexey Navoykov:

Por favor, dé un ejemplo del uso de esta construcción.

Alexey Navoykov  
fxsaber:

Por favor, dé un ejemplo de cómo utilizar esta construcción.

El ejemplo más trivial es el de una clase array, que en este caso se utiliza para almacenar cualquier puntero:

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;
fxsaber  
Alexey Navoykov:

El ejemplo más trivial es la clase array. En este caso se utiliza para almacenar cualquier puntero.

¿Cómo utilizarlo entonces?

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  
Alexey Navoykov:
Cast al tipo que pusiste originalmente (o comprueba a través de dynamic_cast).
//    (A*)Pointers[i].OnInit();
    ((A*)Pointers[i]).OnInit();

Esto es sólo sobre el tema de si los paréntesis son necesarios/no necesarios... Con este casting sería un coñazo en el script de arriba cuando se ejecute. Es decir, necesitas conocer los nombres de las clases a las que se refieren los elementos del puntero del array.

No veo cuál es la conveniencia entonces.


MQ sólo utiliza void* en un lugar.

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

MQ sólo utiliza void* en un lugar.

Debido a que tienen todo construido en CObject, hace que sea imposible utilizar sus contenedores para sus propias clases e interfaces, no heredadas de su clase. Es decir, no es una solución universal.

Esto es probablemente debido al hecho de que en el momento de la creación de su biblioteca no había void* en MQL todavía. Pero por otro lado su objeto en sí mismo también participa en algunas manipulaciones (cambiando los valores de los punteros en él), que en sí mismo es simplemente salvaje.

fxsaber  
Alexey Navoykov:

Esto hace que sea imposible utilizar sus contenedores para sus propias clases e interfaces no heredadas de su clase, es decir, no es una solución universal.

Tal vez esto se deba a que en el momento en que se creó su biblioteca, aún no existía void* en MQL.

Por desgracia, no he visto ningún ejemplo de su uso.

Razón de la queja: