Errores, fallos, preguntas - página 1416

 
¿Cuándo se produce el "Error interno del compilador"?  
Ilyas:
Hasta ahora conocemos dos casos:
1) En la operación bool &= (expresión bool)
2) Coma innecesaria en las secuencias de inicialización: val={ {...},{...}, }.

¿Siguen sin solucionarse estos fallos en la nueva compilación? Mi compilador sigue generando un error, tengo que seguir con la compilación 1159.

 
Renat Fatkhullin:
El requisito de las plantillas es colocar todos los métodos dentro de la descripción de la clase sin poner los cuerpos fuera.

Ya veo, lo principal es mantener este requisito, porque acaba de crear los contenedores de pila y cola y un mes después aparecieron las plantillas de clases, y todo debería funcionar mejor con ellas :)

Otra pregunta es sobre las plantillas de las clases. Hay dos clases de plantillas, una clase utiliza a otra, ¿se transferirá un tipo de una clase de plantilla a otra o no?

 
coderex:

Ya veo, lo principal es mantener este requisito, porque acaba de crear los contenedores de pila y cola y un mes después aparecieron las plantillas de clases, y todo debería funcionar mejor con ellas :)

Otra pregunta es sobre las plantillas de las clases. Hay dos clases de plantilla, una de las clases utiliza otra, ¿habrá una transferencia de tipo de una clase de plantilla a otra o no?

Pruébalo.
 
Renat Fatkhullin:
Pruébalo.
Lo pruebo y me da unos cuantos errores, pienso en otra forma de hacerlo...
 

Ilyas:
На сегодня известно о двух случаях:
1) в операции bool &= (bool expression)
2) Лишняя запятая в инициализирующих последовательностях: val={ {...},{...}, }

Alexey Navoykov:
¿Aún no se han solucionado estos errores en la nueva compilación? Mi compilador sigue dando un error, tengo que quedarme en la compilación 1159.

Lo he comprobado por si acaso con una coma extra en el p.2 en MT4 890 - sólo da un mensaje de error.
 

¿Alguien ha hecho una clasificación de CList?

Básicamente tenemos que anular el Comparador.

Pero todo el tiempo llamo a Compare de la clase base. Pero no funciona, me pregunto qué pasa aquí...

Hice un simple ejemplo:

class COperation : public CObject
  {
public:
   double           number;
   COperation(double p) { number = p;}

virtual int Compare(const CObject *node,const int mode=0);
  };
  
 int COperation::Compare(const CObject *node,const int mode=0)
  {
   const COperation *ppp = node;
   
   if(this.number > ppp.number)
     {
      return 1;
     }
   if(this.number < ppp.number)
     {
       return -1;
     }
   
  return 0;
 }   


void OnStart()
  {
   CList *list = new CList();
   list.Add(new COperation(3));
   list.Add(new COperation(4));
   list.Add(new COperation(7));
   list.Add(new COperation(2));
   list.Add(new COperation(3));
   list.Add(new COperation(9));
   list.Add(new COperation(0));
   list.Add(new COperation(1));
   
   Print("After Sort");
   COperation *node = list.GetFirstNode();
   string numbers = "";
   for(;node != NULL; node = node.Next())
     {
      numbers += (string)node.number + " ";
     }
    Print(numbers); 
    numbers = "";
     
   list.Sort(0);
   
   Print("Before Sort");
   node = list.GetFirstNode();
   for(;node != NULL; node = node.Next())
     {
      numbers += (string)node.number + " ";
     }
   Print(numbers); 
   
   
   delete list;
  }
Archivos adjuntos:
sort.mq5  3 kb
 

Al procesar plantillas anidadas (MQL4), veo fallos con el paso de tipos, ¿alguien lo ha notado?

En concreto, hay una clase A con un método de plantilla, dentro de la cual se crea un objeto de otra clase B mediante un constructor de plantilla que utiliza el mismo tipo T con el que se inicializó el método. Como resultado, dentro de ese método el typename define correctamente el tipo pasado, por ejemplo, como int, pero dentro del constructor B el typename ya es string.

¿SD?

 
La forma más ortodoxa de ordenar la hoja es sobrecargarla en un array, ordenar el array y volver a sobrecargarlo.
 

Utilizo la clasificación todo el tiempo, sin ningún problema.

Tú,sigma7i, has sobrescrito incorrectamente el método Coperation::Compare(), devuelve el tipo de valor equivocado, que el método base CObject::Compare() devuelve, y el compilador lo toma como separado, no virtual. Como resultado, sólo se llama al método base en sus objetos, el compilador cree que no hay descendientes...

 
sigma7i:

Pero todo el tiempo llama a Compare de la clase base. Pero no funciona, así que creo que hay algo mal...

virtual int Compare(const CObject *node,const int mode=0) const;