dynamic_cast на компиляторе clang llvm не работает

Я вижу странную ошибку, когда dynamic_cast возвращается NULL на лязг компилятора. Но тот же код работает со средой gcc.

Не могли бы вы указать мне, что может быть причиной? Какая может быть разница между dynamic_cast на llvm и gcc.

Я использую поведение по умолчанию обоих компиляторов, где я думаю, что RTTI включен по умолчанию.

template<typename T> T*
find_msg_of_type(
MsgList *list
) {
T* msg = NULL;

if (list) {
for (std::vector<MsgList*>::iterator it = list->element.begin();
it != list->element.end();
it++) {// MsgList can be list of objects build with GSoap.
if (typeid(*(*it)) == typeid(T)) {
msg = dynamic_cast<T*>(*it); // Failing on clang but this same code is working with gcc compiler.
break;
}
}
}

return msg;
}

Еще одно наблюдение: с gcc

if (typeid(*(*it)) == typeid(T))

работает отлично, как и ожидалось, но с лязг

if (typeid(*(*it)) == typeid(T))

сравнение показывает другое поведение .. не уверен точно, почему это отличается.

Спасибо

7

Решение

Для такого кода хорошей идеей является статическое обеспечение того, что класс T является производным от MsgList. Используя boost, это можно сделать так:

BOOST_STATIC_ASSERT ((повышение :: is_base_and_derived :: значение));

0

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

Других решений пока нет …

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