Errori, bug, domande - pagina 1570

 

Necessità di perfezionare i modelli (prendere l'implementazione al di fuori della classe A {})

template<typename T>
class A { public:
template<typename T2>
        void f1( T2 t2 );
template<typename T2>
        void f2( T2 t2, T tt ) { Print( __FUNCSIG__, " ", typename( this.t ) ); }
template<typename T2>
        void f3( T2 t2, T tt );
        T t;
};
template<typename T>
template<typename T2>
void A::f1( T2 t2 )       { Print( __FUNCSIG__, " ", typename( this.t ) ); } //нормально
template<typename T>
template<typename T2>
void A::f3( T2 t2, T tt ) { Print( __FUNCSIG__, " ", typename( this.t ) ); } // error: 'T' - declaration without type

Non posso implementare A::f3 al di fuori della classe A {}.

Ma all'interno della classe A {} è possibile. Sì, è possibile... per esempio, f2(), ma l'inconveniente sta nello scopo di prendere funzioni ingombranti al di fuori della classe A {}. La cosa principale è che A::f1() può essere portata all'interno della classe A {} e tutto funziona mentre A::f3() non può - il compilatore genera un errore.

 
No, è una stronzata, comunque un typedef dovrebbe risolvere il problema
 
A100:

Necessità di perfezionare i modelli (prendere l'implementazione al di fuori della classe A {})

Non posso implementare A::f3 al di fuori della classe A {}.

Ma all'interno della classe A {} è possibile. Sì, è possibile... per esempio, f2(), ma l'inconveniente sta nello scopo di prendere funzioni ingombranti al di fuori della classe A {}. La cosa principale è che A::f1() può essere scritto fuori dalla classe A {} e tutto funziona mentre A::f3() non può - il compilatore genera un errore perché A::f1() e A::f3() principalmente non differiscono in alcun modo.

Questo è il modo in cui si compila normalmente.

template<typename T>
class A { public:
template<typename T2>
        void f1( T2 t2 );
template<typename T2,typename T>
        void f2( T2 t2, T tt ) { Print( __FUNCSIG__, " ", typename( this.t ) ); }
template<typename T2,typename T>
        void f3( T2 t2, T tt );
        T t;
};
template<typename T2>
void A::f1( T2 t2 )       { Print( __FUNCSIG__, " ", typename( this.t ) ); } //?????????
template<typename T2,typename T>
void A::f3( T2 t2, T tt ) { Print( __FUNCSIG__, " ", typename( this.t ) ); } //error: 'T' - declaration without type

E f1 e f3 sono un po' diversi

 
Andrey Barinov:

Questo è il modo in cui si compila normalmente.

Non lo è - il compilatore ha semplicemente assunto che non ci sia nessun OnStart - nessun problema.

aggiungere

void OnStart()
{
        A<long> a;
}
 

Errore di compilazione: errore interno #9

File:
Test114.mq5  3 kb
 

Se cambiate un paio di righe, l'errore cambia in: errore di ottimizzazione dell'albero

Ma originariamente (prima della semplificazione) l'errore era: errore di generazione del codice

E tutto finisce lì - ma prima tutto funzionava bene.

File:
Test115.mq5  3 kb
 
A100:

Fai un sacco di fonti diverse di slim in un unico archivio. In modo che gli sviluppatori possano usarlo prima di far uscire un'altra build buggata.

Chiama l'archivio "test dei pidocchi". Sicuramente, ci sono tali varianti di test per diversi tipi di compilatori.

 
Errore di compilazione: errore di generazione del codice
File:
Test116.mq5  2 kb
 


Ilgrafico di ottimizzazione smette di essere disegnato a causa del calcolo errato del valore del criterio. Si prega di correggerlo, poiché è molto comodo osservare il processo di ottimizzazione sul grafico.

Appare solo su criteri Balance + max RF. // Almeno nella mia (finora piccola) pratica.

// Solo il grafico si rompe, l'ottimizzazione ha successo.

----------- UPD

Проявляется только на критерии Balance + max RF.

Mi sbagliavo.


 

Comportamento diverso di & e GetPointer

class A {};
class B {
        A *f() const { return GetPointer( a ); } //не генерирует ошибки
        A *g() const { return &a; }              //ошибка: 'return' - cannot convert from const pointer to nonconst pointer
        A a;
};