Одной из проблем является то, что параметр шаблона для Extension2
не соответствует сигнатуре, имеющейся у Base1
. Другая причина в том, что Extension2
не соответствует типу параметра, ожидаемому Base1
.
Если вы измените определение Extension2
для правильного принятия Base1
, оно само по-прежнему не является кандидатом для передачи на Base1
. Вы можете обойти это с внутренним классом шаблона, который соответствует тому, что ожидает Base1
. Этот внутренний класс будет выглядеть так: Extension1
.
template <template<template<typename...> class> class Plugin>
class Extension2 {
template <class P>
struct Inner {
Inner () : plugin_(static_cast<P *>(this)) {}
void beep() { plugin_->beep(); }
private:
P* plugin_;
};
public:
Extension2() {}
void beep() {
plugin_.beep();
std::cout << "Extension2\n";
}
private:
Inner<Plugin<Inner>> plugin_;
};