Проблема в том, что вы ошибочно полагаете, что есть что-то общее между D<A>
и D<B>
. Экземпляры шаблона: типы , а два разных экземпляра - это два разных типа, конец истории. Только так бывает, что экземпляры одного и того же шаблона имеют формально похожий код, но со специализацией вы можете определить любой тип, который вам нравится. Короче говоря, каждый тип, который вы определяете явно, является полностью независимым, и между специализированными экземплярами шаблона нет общего, даже если они имеют одно и то же имя.
Например:
template <typename T> struct Foo
{
T & r;
const T t;
void gobble(const T &);
Foo(T *);
};
template <> struct Foo<int>
{
std::vector<char> data;
int gobble() const;
Foo(bool, int, Foo<char> &);
};
Типы Foo<char>
и Foo<int>
не имеют ничего общего друг с другом, и нет никаких причин, по которым какая-либо часть одного должна иметь какое-либо применение внутри другого.
Если вы хотите выделить общие черты, используйте частное наследование:
template <typename> struct D : private DImpl { /* ... */ }