Errori, bug, domande - pagina 2271
![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Un errore di compilazione:
Qual è la differenza fondamentale tra (1)(2) e (3)(4)?
Se dichiarate le classi (3)(4) al di fuori delle funzioni, non si verifica alcun errore. Se dichiarate all'interno di una funzione, si verificano errori.
A cosa può essere collegato il seguente comportamento
compilare l'indicatore funziona correttamente, compilare di nuovo l'indicatore non funziona correttamente. Funziona correttamente nel tester?
Quale indicatore?
Cosa produce qui il C++?
Per farlo funzionare in MQL5, è necessario avere due stringhe diverse nell'output, non la stessa. Ma allora il meccanismo di formazione della firma dovrebbe essere assolutamente diverso. Se il C++ dà lo stesso risultato in stampa, il costo di __FUNCSIG__ diminuirà drasticamente.
Risultato: C++
void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )
Come potete vedere le corde sono diverse... viene usata la firma della funzione
Risultato: C++
void f<g1::A>( g1::A& )
void f<g2::A>( g2::A& )
Come potete vedere le corde sono diverse... viene usata la firma della funzione
MQL5 cede.
void f<A>(A&)
Cioè non c'è una firma di classe all'interno della funzione. Un giorno sarà supportato.
E se la classe è globale, quale linea genera il C++?
void f<::A>( ::A& )
void f<A>( A& )
MQL5 dà
Cioè non c'è una firma di classe all'interno della funzione. Un giorno sarà supportato.
Se i compilatori C++ obsoleti non lo supportano, danno già un errore sulla prima linea (1) nel codice sorgente. È per questo che la domanda è stata posta in questo modo in primo luogo: perché c'è un errore in un caso e un errore normale nell'altro?
Ci aspettavamo lo stesso comportamento in entrambi i casi: o un errore o nessun errore. E l'errore non è nella mancanza di supporto di per sé, ma nel comportamento ineguale in condizioni altrimenti uguali (come in questo esempio)
E se la classe è globale, quale linea produce il C++?
void f<::A>( ::A& )
void f<A>( A& )
La seconda variante
Se i compilatori C++ obsoleti non lo supportano, danno già un errore sulla prima linea (1) nel codice sorgente. È per questo che la domanda è stata posta in questo modo in primo luogo: perché c'è un errore in un caso e un errore normale in un altro?
Ci aspettavamo lo stesso comportamento in entrambi i casi: o un errore o nessun errore. E l'errore non è nella mancanza di supporto di per sé, ma nel comportamento ineguale, a parità di condizioni (come in questo esempio)
Beh, è facile da spiegare. Il compilatore va dall'alto verso il basso attraverso il codice formando man mano le firme corrispondenti. La prima firma viene creata senza problemi. Si arriva alla seconda e c'è già una firma del genere. Qui abbiamo un errore nella seconda linea.
Se dichiarate le classi (3)(4) al di fuori delle funzioni, non si verificano errori. Se dichiarate all'interno di una funzione - si verificano errori.
sostituire con
Se dichiarate all'interno di una funzione, non si verificano nemmeno errori... qual è la differenza fondamentale?
Quindi è comprensibile. Il compilatore va dall'alto verso il basso del codice, formando le firme appropriate man mano che va avanti. Crea la prima firma senza problemi. Arriva al secondo e ne ha già uno. Così, c'è un errore nella seconda linea.
Allora perché compila in MQL senza errori?
Risultato: MQL C++
vuoto f<A>() void f<g1::A>()
vuoto f<A>() void f<g2::A>()
Perché le firme vengono create qui senza alcuna interferenza?
Allora perché compila in MQL senza errori?
Risultato: MQL C++
vuoto f<A>() void f<g1::A>()
vuoto f<A>() void f<g2::A>()
Perché le firme vengono create qui senza alcuna interferenza?
Uno è solo creato. Inoltre, in f non si può usare T. Comunque, la situazione è ovvia per me.