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

 

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

template<typename T>
class A
{ 
};

A<void*> a;  // '<' - cannot to apply function
 
¿Era posible antes?
 
Comprobaré este anuncio con C++ por la noche
 
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?
 
Alexey Navoykov:

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

 
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;
 
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:

¿Cómo utilizarlo entonces?

De la misma manera que, por ejemplo, se utiliza CObject en los contenedores de metacitas. Haces un casting al tipo que pusiste inicialmente (o lo compruebas con dynamic_cast). Es un poco sorprendente que preguntes eso.
 
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*);
 
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.

 
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: