Errori, bug, domande - pagina 2271

 
A100:
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.

 
Vladimir Pastushak:

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?

 
fxsaber:

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

 
A100:

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& )

 
fxsaber:

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)

 
fxsaber:
E se la classe è globale, quale linea produce il C++?

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

void f<A>( A& )

La seconda variante

 
A100:

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.

 
Georgiy Merts:

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.

Se nell'esempio iniziale
        class  A2 { int i; }; //(3)

sostituire con

        interface  A2 {};      //(5)

Se dichiarate all'interno di una funzione, non si verificano nemmeno errori... qual è la differenza fondamentale?

 
fxsaber:

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?

template<typename T>
void f() { Print(__FUNCSIG__); }
void g1() { class A { int    x; } a; f<A>(); }
void g2() { class A { double x; } a; f<A>(); }
void OnStart()
{
        g1();
        g2();
}

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?

 
A100:

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.