Errori, bug, domande - pagina 1416

 
Quando si verifica l'"errore interno del compilatore"?  
Ilyas:
Siamo a conoscenza di due casi finora:
1) In operazione bool &= (espressione bool)
2) Virgola non necessaria nelle sequenze di inizializzazione: val={ {...},{...}, }.

Questi bug non sono ancora stati risolti nella nuova build? Il mio compilatore genera ancora un errore, devo attenermi alla build 1159.

 
Renat Fatkhullin:
Il requisito dei template è di mettere tutti i metodi all'interno della descrizione della classe senza mettere i corpi all'esterno.

Capisco, la cosa principale è mantenere questo requisito, perché ho appena creato i contenitori stack e queue e un mese dopo sono apparsi i modelli di classe, e tutto dovrebbe funzionare meglio con loro :)

Un'altra domanda riguarda i modelli di classe. Ci sono due classi template, una classe ne usa un'altra, un tipo si trasferirà da una classe template all'altra o no?

 
coderex:

Capisco, la cosa principale è mantenere questo requisito, perché ho appena creato i contenitori stack e queue e un mese dopo sono apparsi i modelli di classe, e tutto dovrebbe funzionare meglio con loro :)

Un'altra domanda riguarda i modelli di classe. Ci sono due classi template, una delle classi ne usa un'altra, ci sarà un trasferimento di tipo da una classe template all'altra o no?

Provate.
 
Renat Fatkhullin:
Provate.
Lo provo e ottengo qualche errore, penso a un altro modo per farlo...
 

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

Alexey Navoykov:
Questi bug non sono ancora stati risolti nella nuova build? Il mio compilatore mi dà ancora un errore, devo rimanere sulla build 1159.

Controllato per sicurezza con la virgola extra in p.2 in MT4 890 - dà solo un messaggio di errore.
 

Qualcuno ha fatto una cernita di CList?

Fondamentalmente abbiamo bisogno di sovrascrivere Compare.

Ma per tutto il tempo chiamo Compare della classe base. Ma non funziona, mi chiedo cosa ci sia di sbagliato qui...

Ha fatto un semplice esempio:

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;
  }
File:
sort.mq5  3 kb
 

Quando si elaborano modelli annidati (MQL4), vedo dei glitch con il passaggio di tipo - qualcuno l'ha notato?

In particolare, c'è una classe A con un metodo template, all'interno del quale un oggetto di un'altra classe B viene creato da un costruttore template usando lo stesso tipo T con cui è stato inizializzato il metodo. Di conseguenza, all'interno di quel metodo il typename definisce correttamente il tipo passato, ad esempio int, ma all'interno del costruttore B il typename è già string.

SD?

 
Il modo più ortodosso per ordinare il foglio è quello di sovraccaricarlo in un array, ordinare l'array e sovraccaricarlo di nuovo.
 

Uso l'ordinamento tutto il tempo - nessun problema.

Tu,sigma7i, hai erroneamente sovrascritto il metodo Coperation::Compare(), esso restituisce il tipo sbagliato di valore, che il metodo base CObject::Compare() restituisce, e il compilatore lo prende come separato, non virtuale. Come risultato, solo il metodo base è chiamato nei tuoi oggetti, il compilatore crede che non ci sia nessun discendente...

 
sigma7i:

Ma tutto il tempo chiama Compare della classe base. Ma non funziona, quindi penso che ci sia qualcosa di sbagliato...

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