Errori, bug, domande - pagina 2869

 
A100:

Hai un errore di sintassi - dai un esempio di codice funzionante con (typename) tra parentesi. Si potrebbe anche scrivere (OnStart) tra parentesi

Beh, non c'è nessun errore di sintassi

typename(J)

Ma considerate già questo codice un errore di sintassi?

(typename)J

Quando un principio di conversione dei tipi dovrebbe funzionare qui, e Help permette entrambe le varianti.

 
Roman:

In questo modo, non c'è nessun errore di sintassi.

Questo conta come un errore di sintassi?

Quando il principio della conversione dei tipi dovrebbe funzionare qui, e l'aiuto permette entrambi.

template<typename T>

typename non è un tipo, è una parola chiave. In questo caso, il tipo è T. La conversione è a un tipo, non alla parola chiave.

La giustificazione filosofica non è appropriata in questo caso. Anche se se MQL fosse un linguaggio astratto, potremmo probabilmente ricorrere al casting alla parola chiave e si sposterebbe immediatamente al 1° posto nella classifica

 
A100:

typename non è un tipo, è una parola chiave. In questo caso, il tipo è T. La conversione è in un tipo, non in una parola chiave

La giustificazione filosofica non è appropriata in questo caso. Anche se, se MQL fosse un linguaggio astratto, potremmo probabilmente lanciarlo alla parola chiave, e passerebbe al 1° posto nella classifica

Ho capito che typename non è un tipo.
Ma in questo caso, stiamo ottenendo una trasformazione.
Otteniamo il suo tipo da una costante.
Forsequesto non è corretto nella sintassi? Ma funziona.

#define  A '+'

typename(A)
 
Roman:

Ho capito che typename non è un tipo.
Ma in questo caso, otteniamo una trasformazione.
Da una costante, otteniamo il suo tipo.
Forsequesta non è la sintassi giusta? Ma funziona.

Funziona, ma non nel modo in cui si pensa. Non si ottiene un tipo ma una stringa. Volevo mostrarvelo con un esempio, ma ho ottenuto un errore qui sotto.

Ma non significa che hai ragione - solo un altro errore del compilatore.

 
Errore di compilazione:
void OnStart()
{
    Print(typename("ushort"));      //(1) нормально
    Print(typename(typename('+'))); //(2) Error: 'typename' - unexpected token
}

Qual è la differenza tra (1) e (2)? Cari sviluppatori - forse Roman ha ragione e ora typename restituisce il tipo?

Il risultato era atteso: stringa

 
A100:

Funziona, ma non nel modo che immaginate. Non si ottiene un tipo, ma una stringa. Volevo mostrarlo con un esempio, ma ho avuto un errore:

Cosa vuol dire che non è un tipo?
È un tipo, non una stringa.
ushort non è una stringa.

#define   A '+'

void OnStart()
{
   Print(typename(A));
   Print(typename("string"));
}
2020.10.09 01:45:54.402 TestScript (MNQZ20,M1)  ushort
2020.10.09 01:45:54.402 TestScript (MNQZ20,M1)  string
 
Roman:

Come non è un tipo?
Sto solo ottenendo un tipo, non una stringa.
Ushort non è una stringa.

Non si ottiene ushort, ma "ushort". Se non capite la differenza, leggete la documentazione prima di capire.

Anche se sarebbe bello avere un vero ushort!

 
A100:

Non si ottiene ushort, ma "ushort". Capite la differenza? Se no, leggete la documentazione per capire

Quindi Print() lo stampa già come "ushort" con un letterale di stringa.
Cosa c'entra? Il fatto stesso che typename restituisce un nome di tipo!

 
Roman:

Quindi questo stampa già Print() come letterale di stringa "ushort".
Cosa c'entra questo? Il fatto stesso che typename restituisce un nome di tipo!

Avete letto la documentazione al link? Anche lì c'è un esempio. Sfortunatamente, il mio esempio è fallito.

 
A100:

Avete letto la documentazione sul link?

Che cosa ha a che fare con i modelli?
Se la sintassi d'uso non è per un template, in questo caso.