Может ли специализированный метод шаблона обойти метод по умолчанию, который не будет компилироваться из-за создания абстрактного объекта?

Это может быть странный вопрос, но он может быть весьма удобен в моем случае использования.

У меня есть общий класс:

      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);
}

Есть ли способ избежать этой проблемы с компиляцией?

(Специализация находится в другом файле)

0 ответов

Другие вопросы по тегам