Можно объявить класс шаблона, использовать указатели для него, а затем предоставить определение. Но на самом деле это не то, что пытается сделать ваш код.
Вы пытаетесь объявить и использовать переменную с неполным типом. Это недопустимо. Однако вы можете параметризовать весь фрагмент кода, поэтому он тоже становится шаблоном. Затем он читает больше как:
Generic<TypeParam>* p = new Generic<TypeParam>;
и в зависимости от TypeParam
, может быть расширен (только во время компиляции) любой из трех случаев показывают.
Чтобы сделать выбор типа во время выполнения, вам понадобится общий базовый класс. Специализации шаблонов никак не связаны с наследованием.
Параметры шаблона должны быть известны во время компиляции. Вы должны изучить альтернативу, такую как динамический полиморфизм. –