Я хочу сделать:
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.
Я действительно не вижу решения этой проблемы!
Редактировать
Причина, по которой я это делаю, заключается в том, что я хочу иметь возможность использовать BattleData
непосредственно как class
, но я также хочу иметь возможность подкласса его, и в этом случае я должен указать производное class
как второй 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, заключается в том, что у них нет виртуальных функций. Другая причина, по которой он не работает для меня, состоит в том, что один из родительских классов CRTP вызывает функции, только если они присутствуют в производном типе (используя decltype(Derived::function)
и структуры enable-if like), и в противном случае возвращаются к поведению по умолчанию. , Поскольку может существовать множество таких функций с определенным шаблоном проектирования (например, CRTP, который читает протокол во многих различных случаях и обрабатывает случай определенным образом, только если производный класс задает соответствующую функцию, в противном случае просто передайте его без обработки ).
Таким образом, эти функции могут присутствовать в SubBattleData
, а не в BattleData
, но оба экземпляра будут работать нормально, если их создать, но невозможно создать экземпляр BattleData
.