Я думаю, что вывод вашего класса из базового класса не имеет отношения к данному вопросу, это просто детали реализации. То, что вам действительно нужно, это то, если есть способ частично специализировать функции-члены, такие как конструктор. Вы хотите что-то подобное?
template <typename T, int N> class Foo
{
Foo(); // general
template <typename U> Foo<U, 2>(); // specialized, NOT REAL CODE
};
Это не работает. Вы всегда должны специализироваться на весь класс. Причина проста: вы должны знать полный тип класса сначала до , вы даже знаете, какие функции-члены существуют. Рассмотрим следующую простую ситуацию:
template <typename T> class Bar
{
void somefunction(const T&);
};
template <> class Bar<int>
{
double baz(char, int);
};
Теперь Bar<T>::somefunction()
зависит от T
, но только функция существует , когда T
не int
, потому что Bar<int>
- это совершенно другой класс.
Или рассмотрите даже другую специализацию template <> class Bar<double> : public Zip {};
- даже полиморфная природа класса в специализации может быть совершенно иной!
Таким образом, единственный способ предоставить специализации новые объявления членов, включая конструкторы, - это специализация всего класса. (Вы можете специализировать определение существующих функций, см. Ответ @ Alf.)