Я вижу странный сбой, когда dynamic_cast
возвращает NULL
на компиляторе clang. Но тот же код работает со средой 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))
сравнение показывает другое поведение.. точно не знаю, почему это отличается.
Спасибо
typeid(**it)
иtypeid(T)
, а такжеtypeid(*it)
иtypeid(T*)
в отладочных сообщениях. Также переместитеdynamic_cast
из условия и проверьте, возвращает ли онNULL
— динамическое приведение выполняет внутреннее сравнение typeid, но также принимает экземпляры-потомки. - person Jan Hudec   schedule 03.01.2013rtti
. - person dcow   schedule 25.02.2016