Почему вы не можете также шаблонизировать IProductFactory
на T
?Это избавит вас от вашей ошибки, и она не менее общая.Клиент все еще должен знать, что такое T
, чтобы вызвать метод createProduct
.
Редактировать Re: comment
Для того, чтобы сделатьдля этого вам нужно будет просто создать шаблонную функцию для создания фабрики.Итак:
template<class T> IProductFactory<T>* getProductFactory();
Теперь ваша фабрика шаблонизирована, метод createProduct
больше не является шаблоном элемента.Не уверен, каков ваш критерий для возврата ProductAFactory
против ProductBFactory
, но вам придется либо передать строку, чтобы выбрать, иметь ли это функцию-член другого класса, которая будет принимать решение, или иметь несколько свободныхфункции, но предоставляют одну или другую версию конкретному клиенту.