Вы не можете иметь Base :: func, принимающий различные параметры в зависимости от того, какой класс его наследует. Вам нужно будет что-то изменить.
Вы можете заставить их обоих использовать ParamType и обрабатывать неожиданный параметр любым механизмом, который вам нравится (например, генерировать исключение или возвращать код ошибки вместо void):
struct ParamType;
struct Base {
void func(ParamType&);
}
struct Derived1 : Base {};
//...
Или шаблон по типу параметра, который они должны принимать:
struct ParamType;
struct DerivedParamType1 : ParamType {};
struct DerivedParamType2 : ParamType {};
template<class ParamT>
struct Base {
void func(ParamT&);
};
struct Derived1 : Base<DerivedParamType1> {};
struct Derived2 : Base<DerivedParamType2> {};
Со вторым решением Derived1 и Derived2 не будут иметь общую базу и не могут использоваться полиморфно.