Проблема в том, что class B : public A<int, BlaEnum::Bla2>
и class C : public A<int, BlaEnum::Bla3>
происходят из разных A
, которые не совместимы друг с другом.Каждый из этих классов вызывает создание нового класса шаблона (ни один из которых не совместим с A<int>
).
Для того, чтобы иметь действительную общую базу, вам необходим базовый класс, который не отличается ни одним из параметров шаблона(или это не шаблонный класс) из производных классов.
Изменение вашего примера, например:
template <class T>
class Base
{
public:
virtual void Foo() = 0;
};
template <class T, BlaEnum bla = Bla1>
class A : public Base<T>
{
public:
T att;
BlaEnum bll;
};
// B and C are unchanged
int main()
{
B b;
C c;
// Array of pointers to common base class
Base<int>* BaseArr[2] = { &b,&c };
}
Еще одно примечание: массивы в стиле C не являются хорошей практикой, вы должны предпочесть std::array
(или std::vector
) и умный указатель на необработанные указатели