Xerces. Динамический приведение указателя DOMNode к DOMElement возвращает nullptr

Добрый день. Проблема в следующем. У меня есть действительный файл * .xml, который я пытаюсь проанализировать, используя следующий код:

for(XMLSize_t i = 0; i < childrenNodeCount; ++i)
{
DOMNode* currentNode = children->item(i);

if ((currentNode->getNodeType() != 0) && (currentNode->getNodeType() == DOMNode::ELEMENT_NODE))
{
DOMElement* currentElement = dynamic_cast<xercesc::DOMElement*>(currentNode); // !!!

if (XMLString::equals(currentElement->getTagName(), TAG_SectionHeader))
{
// parse this part
}

if (XMLString::equals(currentElement->getTagName(), TAG_SectionBody))
{
// parse this part
}
}
}

Сбой программы во время выполнения с SIGILL при первой проверке «равно». Отладка показала, что после динамического приведения currentElement фактически является нулевым указателем. В чем здесь может быть проблема?

Компиляция с использованием xlc ++, библиотеки Xerces 2.5, AIX 7.

Постскриптум тот же код работает нормально на Windows, по-видимому.

ОБНОВЛЕНИЕ: изменение dynamic_cast на static_cast заставило код работать без ошибок. Однако некоторые вопросы остались без ответа.

1) Почему код работал без ошибок при использовании dynamic_cast в Windows, но не в Unix? Это может быть проблема с компилятором или версией библиотеки?

2) Есть ли лучший / более чистый способ разыграть в этом случае?

0

Решение

Вы не упомянули версию или параметры компилятора, указали ли вы -qrtti для включения dynamic_cast?

    -qrtti=<option> | -qnortti
(C++) Generates runtime type identification (RTTI)
information for the typeid and dynamic_cast
operators.  The suboptions are:

all
Generates the information needed for the RTTI
typeid and dynamic_cast operators.
type | typeinfo
Generates the information needed for the RTTI
typeid operator only.
dyna | dynamiccast
Generates the information needed for the RTTI
dynamic_cast operator only.

Default: -qnortti
2

Другие решения

Хорошо, причина была в следующем: библиотека Xerces не создается по умолчанию с включенным RTTI. Чтобы заставить механику в OP работать, библиотека должна быть перестроена с включенным RTTI. https://issues.apache.org/jira/browse/XERCESC-819

0

По вопросам рекламы [email protected]