2013-01-02 94 views
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)) 

比較表現出不同的行爲..不知道到底爲什麼這是不同的。

由於

+7

這可能是很多事情。你確定這兩種編譯器的類型是一樣的嗎?並且在兩個編譯器中都有虛擬方法表?這兩種編譯器都支持RTTI嗎?嘗試將問題簡化爲一個小例子,並將其與使用的編譯器命令一起發佈。 –

+0

不要在評論中寫下它,編輯問題!應該總是將其他細節添加到問題主體中。這就是爲什麼它們是可編輯的! –

+0

嘗試在調試消息中打印'typeid(** it)'和'typeid(T)' - 和'typeid(* it)'和'typeid(T *)'。還要將'dynamic_cast'移出條件並檢查它是否返回'NULL' - 動態轉換在內部執行typeid比較,但它也接受後代實例。 –

回答

0

對於這樣的代碼,一個好主意是靜態地確保類T從MsgList的。使用boost,可以這樣做:

BOOST_STATIC_ASSERT(((boost :: is_base_and_derived :: value));