Errori, bug, domande - pagina 2272

 
fxsaber:

Uno è solo creato. Inoltre, in f non sarete in grado di usare T.

Questo di per sé è un errore.
template<typename T>
void f() { Print( sizeof( T )); }
struct A { int a; };
void OnStart()
{
        f<int>(); //(1)//нормально
        f<A>();   //(2)//нормально
struct B { int b; };
        f<B>();   //(3)//Error: 'B' - undeclared identifier
}
E qual è la differenza fondamentale tra (1)(2) e (3)?
 
fxsaber:

Inoltre, in f non sarete in grado di usare T. Tutto sommato, la situazione è ovvia per me.

Inoltre, violato il tuo divieto di usare T in f

template<typename T>
void f() { class T; Print(__FUNCSIG__, ":" , sizeof(T)); }
template<typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart()
{
class A {};
        g<A,int   >();
        g<A,double>();
}

Come potete vedere si compila senza errori, e il fatto che il risultato sia assurdo non è importante, purché tutto sia "spiegabile".

 
Salve a tutti. Aiuto. Non posso fare compravendite di oro, tutto funziona, ma sono le compravendite che non posso fare. Ecco gli screenshot di come appare.
 

Qual è il sacro significato di questo codice, perché l'hanno inserito nella libreria standard?

   if(IsStopped(__FUNCTION__))
      return(false);

Ora è impossibile usare funzioni di chiusura di posizioni o ordini dalla libreria standard in OnDeanite, per esempio con REASON_REMOVE

 
Stanislav Dray:

Qual è il sacro significato di questo codice, perché l'hanno inserito nella libreria standard?

Ora non puoi usare funzioni per chiudere posizioni o ordini dalla libreria standard in OnDynit, per esempio con REASON_REMOVE.

Sì, è un bug.

 
A100:

Inoltre, ho violato il tuo divieto di usare T in f

Come vedete, si compila senza errori, e il fatto che il risultato sia assurdo non è importante - l'importante è che tutto sia "spiegabile".

Non hai capito bene cosa sono i template. Sono simili alle macro solo con alcune caratteristiche.

Ecco il codice

template<typename T>
void f() { class T{ MqlTick a; }; Print(__FUNCSIG__, ":" , sizeof(T)); }
template<typename T1, typename T2>
void g() { class T1 { T2 x; } a; f<T1>(); }
void OnStart()
{
class A {};
        g<A,int   >();
        g<A,double>();
}

.

void f<A>():68
void f<A>():68

Questo perché T è un setup, come le macro, solo con alcune avvertenze. Quello che abbiamo alla fine è che viene creata una firma. All'interno della funzione nessuno conosce A che viene sostituito da T nella funzione. Ma tu definisci questo A all'interno, quindi non si verifica nessun altro errore di compilazione. Ho inserito MqlTick all'interno per mostrare che questo A non ha nulla a che fare con altre classi con lo stesso nome.

In breve, le intraclassi in MQL5 non sono visibili al di fuori della funzione madre. Solo il nome del tipo come classe viene passato come T. In questo caso il nome non ha alcun riferimento alla funzione madre.

Cioè tutto è abbastanza spiegabile logicamente. Non è un bug, ma un'implementazione così limitata.


Forse in un colloquio di lavoro un programmatore C++ direbbe che questo è impossibile.

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


MQL5 è abbastanza possibile.

 
fxsaber:

Non si capisce bene cosa siano gli schemi.

fxsaber:

ZS Probabilmente un programmatore C++ ad un colloquio di lavoro ti dirà che questo è impossibile

Se pensi che questo sia impossibile in C++ significa che non sono io ma tu che non capisci cosa sono i template e come funzionano... tanto più che non si può distinguere un'implementazione sciatta da una vincolata

 
A100:

Se pensi che una cosa del genere sia impossibile in C++ - significa che non sono io, ma tu non capisci cosa sono i template e come funzionano... tanto più che non si può distinguere un'implementazione sciatta da una limitata

Leggete la prima parola della frase su cui date il vostro commento. La mia comprensione dei modelli e delle macro in MQL5 è tale che mi rendo conto senza provare a compilare che i vostri esempi non si compilano in MQL5. C++ - Non lo so, questo non lo impedisce.


Vi sarei grato se poteste mostrare come reagisce C++ a questo codice

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

Bug, bug, domande

fxsaber, 2018.09.03 07:16

ZS Probabilmente un programmatore C++ ad un colloquio di lavoro ti dirà che questo è impossibile

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

Vi sarei grato se poteste mostrarmi come reagisce C++ a questo codice.

La reazione è la stessa del MQL. Perché dovrebbe essere diverso? Un modello è un modello
 
fxsaber:

Non hai capito bene cosa sono i template. E sono simili alle macro, solo con alcuni trucchi.

Sì, questo esempio non compilerà sui plus

errore: dichiarazione di 'struct f()::T' ombre template param template<typename T>

ma anche se compilasse, il risultato vi sorprenderebbe perché il nome della classe sarebbe solo "T".

se è diverso in mql, questo non è corretto