У меня проблема с алмазом при наследовании от шаблонного базового класса, который принимает класс-источник в качестве аргумента шаблона.
Обычно эта проблема решается с помощью виртуального наследования следующим образом:
class Base0
{
protected:
int var = 0;
};
class Base1 : public virtual Base0
{
};
class Base2 : public virtual Base0
{
};
class Derived :
public Base1,
public Base2
{
public:
void f()
{
var = 1; // OK single var
}
};
Однако у меня естьэтот сценарий:
template<typename DERIVED_CLASS>
class TemplatedBase0
{
protected:
int var = 0;
};
class Base1 : public virtual TemplatedBase0<Base1>
{
};
class Base2 : public virtual TemplatedBase0<Base2>
{
};
class Derived :
public Base1,
public Base2
{
public:
void f()
{
var = 1; // ERROR: var is ambigous
}
};
Я понимаю, что в вышеупомянутом случае шаблонный базовый класс не то же самое, т.е. задействованы 2 совершенно нереализованных базовых класса, и похоже, что виртуальное наследование не работает.
Итак, мой вопрос, есть ли способ заставить эту работу? какой дизайн / подход я должен использовать здесь?
Мне нужно иметь базовый класс в качестве шаблона, который принимает тип производного класса. но как сделать возможным наследование алмазов?