Fehler, Irrtümer, Fragen - Seite 1639

 

Wer löst nun das Problem, wenn eine Template-Methode in einer Template-Klasse aus irgendeinem Grund vom Compiler nicht gefunden wird und ein Fehler auftritt?

no one of overloads can be applied to the function call

?

C-Compiler schreiben in solchen Fällen speziell, welche Typen ersetzt wurden und welche Funktionen mit welchem Prototyp nicht gefunden werden, so dass es mehr oder weniger klar ist, was das Problem ist, aber hier - keine Besonderheiten.

 
Ilyas:
Wir haben dies absichtlich so gemacht, da es kein Problem mit der direkten Vererbung gibt.

Ich würde gerne die genaue Regel sehen: Wann habe ich das Recht, eine virtuelle Funktion mit einem anderen Typ von Rückgabewert zu überschreiben?

Oder ist es eine Überlastung?

 
Koldun Zloy:

Ich würde gerne die genaue Regel sehen: Wann habe ich das Recht, eine virtuelle Funktion mit einem anderen Typ von Rückgabewert zu überschreiben?

Nur ein einziger Fall, wenn ein Zeiger auf ein Klassenobjekt zurückgegeben wird, wenn der Rückgabetyp der überschriebenen Funktion von dem Typ, den die überschriebene Funktion zurückgibt, erbt (ist der erste Elternteil in der Mehrfachvererbung, noch nicht in MQL unterstützt).
 

Ich danke Ihnen. Das macht alles Sinn.

 
Ilyas:
...wenn der Rückgabetyp einer überschriebenen Funktion vererbt wird ... von dem Typ, der von dem überschriebenen zurückgegeben wird.

Und wenn es andersherum ist?

class A {};
class B : public A {};
class C {
        virtual B *f() { return NULL; }
};
class D {
        virtual A *f() { return NULL; } //нормально
};
 
A100:

Und wenn es andersherum ist?

Sie haben einen Fehler in Ihrem Beispiel - es gibt keine Vererbung von D an C
 
Ilyas:
Sie haben einen Fehler in Ihrem Beispiel - keine Vererbung von D von C

Ja, mein Fehler, tut mir leid.

class A {};
class B : A {};
class C {
        virtual B *f() { return NULL; }
};
class D : C {
        virtual A *f() { return NULL; } //Error: overriding virtual function with different return type
};
 

Ein weiteres kontroverses Beispiel:

class C;
class A {
        virtual A *f() { return NULL; }
};
class B : A {
        virtual C *f() { return NULL; } //Error: overriding virtual function with different return type
};
class C : B {
        virtual C *f() { return NULL; } //нормально
};
 
A100:

Ein weiteres kontroverses Beispiel:

Trotz des Fehlers (weil keine ausführbare Datei erzeugt wird) überschreibt die Funktion B::f die Funktion A::f, so dass es keinen Überschreibungsfehler für C::f gibt.
 
Ilyas:
Trotz des Fehlers (weil keine ausführbare Datei erzeugt wird) überschreibt die Funktion B::f die Funktion A::f, so dass es keinen Überschreibungsfehler für C::f gibt.

Ich verstehe die Idee nicht ganz, aber es ist fast dasselbe

class C;
class A {
        virtual A *f() { return NULL; }
};
class B : A {
        virtual C *f() { return NULL; } //Error: overriding virtual function with different return type
};
class C : A {};
class C;
class A {
        virtual A *f() { return NULL; }
};
class C : A {};
class B : A {
        virtual C *f() { return NULL; } //нормально
};
In dem einen Fall liegt ein Fehler vor, in dem anderen nicht. Und ich habe einfach die Zeilen vertauscht