Виждам странен отказ, при който 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