Errori, bug, domande - pagina 1965

 
fxsaber:

Esattamente! Ora posso chiamare f tutti i tipi di funzioni e variabili contemporaneamente. Ci deve essere un po' di buon senso in queste ambiguità, per non causare errori accidentali. A mio parere, è logico imbrogliare emettendo una stringa vuota a typename f, piuttosto che causare problemi quando accidentalmente si prende e si definisce un'altra f.

Non cercare così ostinatamente il buon senso ovunque, soprattutto tra gli insetti. Se ti ascolti, qualsiasi bug in MQL non è affatto un bug, ma una caratteristica che è stata inclusa dai saggi sviluppatori ))

Come già notato, se avete dei dubbi, la prima cosa da fare è controllare in C++, e poi trovare una soluzione.

Per quanto riguarda le ambiguità, dovrebbero causare un errore del compilatore e nessun problema. Tutto era chiaro e inequivocabile nel campione A100, quindi non capisco bene cosa intendi. Se avete bisogno di sovraccaricare una funzione, la sovraccaricate e correggete gli errori di compilazione nelle ambiguità e questo è tutto.

 

Come si inizializza un membro statico di una classe modello in MQL?

template<typename T>
class xxx
{
  static int value;
};

template <typename T>
int xxx<T>::value = -1;
 
Stanislav Korotky:

Come si inizializza un membro statico di una classe modello in MQL?

Se è un problema semplice, portatelo in una classe base non modello ed ereditatelo. In generale, non so come.
 
Stanislav Korotky:

Come si inizializza un membro statico di una classe modello in MQL?

template <typename T>
int xxx::value = -1;
 

A100:

template <typename T>
int xxx::value = -1;

In generale, ovviamente, questo metodo non corrisponde al C++, ma funziona in MQL.

Ho avuto un problema simile con il metodo fuori dalla classe:

template<typename T>
class A
{
 public:
  void f();
};

template<typename T>
void A<T>::f() { }  //'A' - identifier already used

Grazie a voi la soluzione è stata trovata:

template<typename T>
void A::f() { }
Anche se questo è ovviamente sbagliato, perché significa definire un metodo template, non un metodo di una classe template. E se una classe li contiene entrambi, ci sarà ambiguità
 
Alexey Navoykov:

Ho avuto un problema simile nel prendere un metodo fuori dalla classe:

È molto più conveniente in questo modo. L'unica restrizione è che non si può avere un'altra classe (come nell'esempio) tra

Forum sul trading, sistemi di trading automatico e test di strategia

Errori, bug, domande

A100, 2016.05.19 23:26

Errore di compilazione

template<typename T>
class A { public:
        bool operator==( const A& ); //error: 'operator' - function must have a body
        T t;
};
class B {
        A<int> a;
};
template<typename T>
bool A::operator==( const A& )  { return false; }
void OnStart()
{
        A<int> a, b;
        Print( a == b );
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2016.05.19
  • www.mql5.com
Форум алго-трейдеров MQL5
 
Alexey Navoykov:

perché significa definire un metodo template piuttosto che un metodo di classe template. E se la classe contiene entrambi, ci sarà ambiguità

Non ci saranno ambiguità, tutto è stato pensato prima di noi (c). Dobbiamo ripetere la linea del modello due volte (quella superiore si riferirà a una classe, quella inferiore a un metodo)
 
A100:
Non lo farà - è stato tutto pensato prima di noi (c). Dovete ripetere la linea del modello due volte (quella superiore si riferirà alla classe - quella inferiore al metodo)

Amico, questo sembra davvero incasinato.

A100:
È molto più conveniente in questo modo.

Sì, beh, non dover mettere <T> è una comodità così seria).

 
Alexey Navoykov:

Sì, non dover mettere un <T> è una comodità così seria).

Intendevo dire che è comodo poter mettere un metodo fuori da una classe
 
Alexey Navoykov:

Ho avuto un problema simile nel prendere un metodo fuori dalla classe:

sbagliato, ovviamente, perché significa definire un metodo template piuttosto che un metodo di classe template. E se la classe li contiene entrambi, ci sarà ambiguità.

Ho notato che i metodi sono spesso collocati al di fuori della classe, ma perché? Ho dato un'occhiata al SB, quindi i metodi "piccoli" sono definiti in una riga alla volta, i metodi "lunghi" sono definiti al di fuori della classe. Non c'è convenienza di percezione, perché ALT+G nella definizione esterna offre non uno, ma due punti di transizione. E se ci sono sovraccarichi, allora un multiplo di due, rispettivamente. E ALT+M mostra già tutto in una volta.

Forse questo è una sorta di tributo alla chiarezza della definizione dell'interfaccia, ma finora non ci sono entrato.