2013-01-02 40 views
7

विफल रहा है मुझे एक अजीब विफलता दिखाई दे रही है जहां dynamic_cast क्लैंग कंपाइलर पर NULL लौटा रहा है। लेकिन एक ही कोड जीसीसी पर्यावरण के साथ काम कर रहा है।llvm clang compiler पर dynamic_cast

क्या आप कृपया मुझे बता सकते हैं कि मूल कारण क्या हो सकता है? Llvm और gcc पर dynamic_cast के बीच क्या अंतर हो सकता है।

मैं संकलक दोनों के डिफ़ॉल्ट व्यवहार का उपयोग कर रहा हूं जहां मुझे लगता है कि आरटीटीआई डिफ़ॉल्ट रूप से सक्षम है।

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; 
} 

एक और अवलोकन: जीसीसी

if (typeid(*(*it)) == typeid(T)) 

के साथ पूरी तरह से काम कर रहा है के रूप में उम्मीद लेकिन बजना साथ

if (typeid(*(*it)) == typeid(T)) 

तुलना अलग व्यवहार दिखाया जा रहा है .. यकीन नहीं वास्तव में क्यों यह अलग है।

धन्यवाद

+7

यह कई चीजें हो सकती है। क्या आप सुनिश्चित हैं कि प्रकार दोनों कंपाइलरों में समान है? और दोनों कंपाइलर्स में वर्चुअल विधियों की मेज है? और दोनों कंप्यूटर्स में आरटीटीआई सक्षम है? समस्या को एक छोटे से उदाहरण में कम करने का प्रयास करें और इसे इस्तेमाल किए गए कंपाइलर कमांड के साथ पोस्ट करें। –

+0

टिप्पणियों में इसे मत लिखें, प्रश्न संपादित करें! प्रश्न विवरण में अतिरिक्त विवरण हमेशा जोड़ा जाना चाहिए। यही कारण है कि वे संपादन योग्य हैं! –

+0

'टाइपिड (** इसे)' और 'टाइपिड (टी) '-and' टाइपिड (* इसे)' और 'टाइपिड (टी *)' -बिन संदेशों को प्रिंट करने का प्रयास करें। स्थिति के बाहर 'गतिशील_कास्ट' को भी ले जाएं और इसे 'न्यूल' लौटने के लिए जांचें- डायनामिक कास्ट आंतरिक रूप से टाइपिड तुलना करता है, लेकिन यह वंशज उदाहरण भी स्वीकार करता है। –

उत्तर

0

इस तरह कोड के लिए, एक अच्छा विचार स्थिर सुनिश्चित करना है कि वर्ग टी MsgList से ली गई है है। बूस्ट का उपयोग करके, यह इस प्रकार किया जा सकता है:

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