私はやってみたいです:
template <class Derived=BattleData>
class BattleData : public BattleCommandManager<Derived> {
};
しかし、明らかにBattleData
宣言されていないので、前方宣言を試みました:
template <class T> class BattleData;
template <class Derived=BattleData>
class BattleData : public BattleCommandManager<Derived> {
};
しかし、私は得る
エラー: 「BattleData の 2 行目のテンプレート パラメーターの番号が間違っています。
私は本当にこれに対する解決策を見ることができません!
編集:
私がこれを行っている理由は、BattleData
として直接使用できるようにしたいclass
からですが、それをサブクラス化できるようにしたいためです。その場合、派生class
を 2 番目のtemplate
パラメーターとして指定する必要があります。
たとえば、私のBattleData
クラスのコーパスが次のようになっているとしましょう:
template <class Derived> class BattleData: public BaseClass<Derived> {
void foo1(){};
void foo2(){};
void foo3(){};
}
そして、私はサブクラスを持っています
template class SubBattleData: public BattleData<SubBattleData> {
void foo1(){};
}
場合によっては、次のようなコードを記述できるようにしたいと思います。
BattleData *x = new BattleData(...);
デフォルトの引数を使用できなければ、次のことさえできません。
BattleData<BattleData> *x = new BattleData<BattleData>(...);
一方では、関数が BattleData クラスで仮想化されていない理由は、仮想関数がないことの利点です。私にとってうまくいかないもう1つの理由は、親CRTPクラスの1つが派生型に存在する場合にのみ関数を呼び出し(decltype(Derived::function)
構造体を使用してenable-ifのように)、それ以外の場合はデフォルトの動作にフォールバックすることです。特定の設計パターンを持つこれらの関数が大量に存在する可能性があるため (多くの異なるケースを持つプロトコルを読み取り、派生クラスが対応する関数を指定する場合にのみ特定の方法でケースを処理する CRTP のように、それ以外の場合は処理せずに転送するだけです) )。
したがって、これらの関数は に存在しても存在しなくてもかまいSubBattleData
ませんBattleData
が、両方のクラスはインスタンス化されていれば問題なく動作しますが、インスタンス化することは不可能BattleData
です。