Fehler, Irrtümer, Fragen - Seite 1570

 

Es ist notwendig, die Vorlagen zu verfeinern (Implementierung außerhalb der Klasse 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

Ich kann A::f3 nicht außerhalb der Klasse A {} implementieren.

Aber innerhalb der Klasse A {} können Sie das. Ja, Sie können... z.B. f2(), aber die Unbequemlichkeit liegt in der Absicht, umständliche Funktionen außerhalb der Klasse A {} zu nehmen. Die Hauptsache ist, dass A::f1() innerhalb der Klasse A {} gebracht werden kann und alles funktioniert, während A::f3() nicht funktioniert - der Compiler erzeugt einen Fehler.

 
Nee, das ist Mist, übrigens soll ein Typedef das Problem lösen
 
A100:

Es ist notwendig, die Vorlagen zu verfeinern (Implementierung außerhalb der Klasse A {})

Ich kann A::f3 nicht außerhalb der Klasse A {} implementieren.

Aber innerhalb der Klasse A {} können Sie das. Ja, Sie können... z.B. f2(), aber die Unbequemlichkeit liegt in der Absicht, umständliche Funktionen außerhalb der Klasse A {} zu nehmen. Die Hauptsache ist, dass A::f1() außerhalb der Klasse A {} gebracht werden kann und alles funktioniert, während A::f3() das nicht kann - der Compiler erzeugt einen Fehler, weil A::f1() und A::f3() sich prinzipiell in keiner Weise unterscheiden.

So wird es normalerweise kompiliert.

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

Und f1 und f3 sind ein bisschen anders

 
Andrey Barinov:

So wird es normalerweise kompiliert.

Ist es nicht - der Compiler hat einfach angenommen, dass es kein OnStart gibt - kein Problem.

hinzufügen.

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

Kompilierungsfehler: interner Fehler #9

Dateien:
Test114.mq5  3 kb
 

Wenn Sie ein paar Zeilen ändern, ändert sich die Fehlermeldung in: Fehler bei der Baumoptimierung

Ursprünglich (vor der Vereinfachung) lautete der Fehler jedoch: Codegenerierungsfehler

Und das war's dann auch schon - aber vorher hat alles gut funktioniert.

Dateien:
Test115.mq5  3 kb
[Gelöscht]  
A100:

Erstellen Sie viele verschiedene schlanke Quellen in einem Archiv. Damit die Entwickler es verwenden können, bevor sie einen weiteren fehlerhaften Build herausbringen.

Nennen Sie das Archiv "Läusetest". Sicherlich gibt es solche Testvarianten für verschiedene Arten von Compilern.

 
Kompilierungsfehler: Fehler bei der Codegenerierung
Dateien:
Test116.mq5  2 kb
 


DasOptimierungsdiagramm wird nicht mehr gezeichnet, da die Berechnung des Kriteriums nicht korrekt ist. Bitte beheben Sie dies, da es sehr praktisch ist, den Optimierungsprozess im Diagramm zu beobachten.

Erscheint nur bei den Kriterien Balance + max RF . // Zumindest in meiner (bisher noch kleinen) Praxis.

// Nur der Graph bricht, die Optimierung ist erfolgreich.

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

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

Ich habe mich geirrt.


 

Unterschiedliches Verhalten von & und 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;
};