7
我看到一個奇怪的故障,dynamic_cast
在clang編譯器上返回NULL
。但是相同的代碼正在使用gcc環境。dynamic_cast on llvm clang編譯器失敗
請問我可能是什麼根源?在llvm和gcc上的dynamic_cast
有什麼區別。
我使用默認情況下啓用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))
比較表現出不同的行爲..不知道到底爲什麼這是不同的。
由於
這可能是很多事情。你確定這兩種編譯器的類型是一樣的嗎?並且在兩個編譯器中都有虛擬方法表?這兩種編譯器都支持RTTI嗎?嘗試將問題簡化爲一個小例子,並將其與使用的編譯器命令一起發佈。 –
不要在評論中寫下它,編輯問題!應該總是將其他細節添加到問題主體中。這就是爲什麼它們是可編輯的! –
嘗試在調試消息中打印'typeid(** it)'和'typeid(T)' - 和'typeid(* it)'和'typeid(T *)'。還要將'dynamic_cast'移出條件並檢查它是否返回'NULL' - 動態轉換在內部執行typeid比較,但它也接受後代實例。 –