Ich möchte folgendes tun:
template <class Derived=BattleData>
class BattleData : public BattleCommandManager<Derived> {
};
Aber offensichtlich ist BattleData
nicht deklariert, also habe ich eine Vorwärtsdeklaration versucht:
template <class T> class BattleData;
template <class Derived=BattleData>
class BattleData : public BattleCommandManager<Derived> {
};
Aber dann bekomme ich
Fehler: "Falsche Anzahl von Vorlagenparametern in der zweiten Zeile mit BattleData."
Ich sehe wirklich keine Lösung dafür!
Bearbeiten:
Der Grund, warum ich das mache, ist, weil ich BattleData
direkt als Klasse
verwenden möchte, aber ich möchte es auch als Unterklasse verwenden können, wobei ich die abgeleitete Klasse
als zweiten Template
-Parameter angeben muss.
Zum Beispiel, angenommen der Hauptteil meiner BattleData
-Klasse ist:
template <class Derived> class BattleData: public BaseClass<Derived> {
void foo1(){};
void foo2(){};
void foo3(){};
}
Und ich habe eine Unterklasse
template class SubBattleData: public BattleData<SubBattleData> {
void foo1(){};
}
Ich möchte trotzdem in einigen Fällen Code wie diesen schreiben können:
BattleData *x = new BattleData(...);
Ich kann nicht einmal folgendes tun, ohne Standardargumente verwenden zu können:
BattleData *x = new BattleData(...);
Einerseits ist der Grund, warum Funktionen in der BattleData-Klasse nicht virtualisiert sind, der Vorteil, keine virtuelle Funktion zu haben. Der andere Grund, warum es für mich nicht funktioniert, ist, dass eine der Eltern-CRTP-Klassen Funktionen nur aufruft, wenn sie im abgeleiteten Typ vorhanden sind (mit decltype(Derived::function)
und enable-if-ähnlichen Strukturen) und andernfalls auf Standardverhalten zurückgreift. Da es eine große Anzahl dieser Funktionen mit einem bestimmten Designmuster geben kann (wie ein CRTP, das ein Protokoll mit vielen verschiedenen Fällen liest und einen Fall nur auf eine bestimmte Weise verarbeitet, wenn die abgeleitete Klasse die entsprechende Funktion spezifiziert, sonst nur transferiert, ohne zu verarbeiten).
Also können diese Funktionen in SubBattleData
vorhanden sein und nicht in BattleData
, aber beide Klassen würden gut funktionieren, wenn instanziiert, aber es ist unmöglich, BattleData
zu instanziieren.