Может ли специализированный метод шаблона обойти метод по умолчанию, который не будет компилироваться из-за создания абстрактного объекта?
Это может быть странный вопрос, но он может быть весьма удобен в моем случае использования.
У меня есть общий класс:
template <typename CGtObj>
class CGtObjectsMap
{
virtual CGtObj* newGtObject(GtId idXML, const CSAXElement *) const { return new CGtObj(idXML); } //!< can be overwritten by MyAbstractClass ;)
virtual void loadFromXml(CSAXElement const* element);
};
с "довольно сложным"
loadFromXml(CSAXElement const* element)
который в какой-то момент:
template <typename CGtObj>
void CGtObjectsMap<CGtObj>::loadFromXml(const CSAXElement *element)
{
...
objPtr = newGtObject(idXML, element);//new CGtObj(idXML);
...
}
Определенный класс, который мне нужно использовать в этом
CGtObjectsMap
является абстрактным. Вот почему я создал виртуальный метод
newGtObject
, надеясь, что мне удастся избежать дублирования всего кода
loadFromXml()
по специализации этого класса.
Но он не компилируется, и у меня ошибка в стандартном определении шаблона
newGtObject()
:
ошибка: недопустимое новое выражение типа абстрактного класса «MyAbstractClass»
приходящий из:
virtual CGtObj* newGtObject(GtId idXML, const CSAXElement *) const { return new CGtObj(idXML); } //!< can be overwritten by MyAbstractClass ;)
хотя я специализировался на этом:
template<>
MyAbstractClass *CGtObjectsMap<MyAbstractClass>::newGtObject(GtId idXML, const CSAXElement *element) const
{
MyAbstractClassType type = static_cast<MyAbstractClassType>(element->childValueByName(XML_TYPE).toInt());
return MyAbstractClass::createAction(type, idXML);
}
Есть ли способ избежать этой проблемы с компиляцией?
(Специализация находится в другом файле)