Я вижу странную ошибку, когда 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))
сравнение показывает другое поведение .. не уверен точно, почему это отличается.
Спасибо
Для такого кода хорошей идеей является статическое обеспечение того, что класс T является производным от MsgList. Используя boost, это можно сделать так:
BOOST_STATIC_ASSERT ((повышение :: is_base_and_derived :: значение));
Других решений пока нет …