Очевидно, вы пытаетесь использовать знаменитый Любопытно повторяющийся шаблон шаблона .
Я не уверен в том, что именно вы хотите сделать, но вы можете избежать неприятностей с другим решением:
Что делать, если вы использовали два класса:
class Base {};
class MyClass: public AddOn<Base> {};
Вы также можете использовать подход, основанный на политике:
class PolicyA_A {};
class PolicyA_B {};
class PolicyB_A {};
class PolicyB_B {};
template <class PolicyA, class PolicyB>
class MyClass: private PolicyA, private PolicyB {};
typdef MyClass<PolicyA_A, PolicyB_A> MyClassAA;
Идея состоит в том, чтобы делегировать часть работы политикам для повышения гибкости.
И последнее, но не менее важное: вы можете использовать Decorator подход:
class Base {};
template <class T>
class AddOn_A: public T {};
class MyClass: public AddOn_A< AddOn_B< Base > > {};
Позволяет избавиться от виртуального наследования, подавляя множественное наследование и делая иерархию линейной.