2013-02-26 141 views
5

मैं क्यों बजना निम्नलिखित कोड को खारिज कर दिया है के रूप में खो दिया है:बजना के रूप में अधूरा type_info अस्वीकार हालांकि <typeinfo> शामिल है

#include <typeinfo> 
#include <exception> 

const char* get_name(const std::exception_ptr eptr) 
{ 
    return eptr.__cxa_exception_type()->name(); 
} 

int main() {} 

यह जीसीसी के साथ ठीक है, लेकिन बजना शिकायत के बारे में type_info एक अधूरी प्रकार किया जा रहा है:

$ g++-4.7 -std=c++0x -O3 -Wall -Wextra t.cc -o t 
$ clang++-3.2 -std=c++0x -O3 -Wall -Wextra t.cc -o t 
t.cc:6:37: error: member access into incomplete type 'const class type_info' 
    return eptr.__cxa_exception_type()->name(); 
            ^
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/exception_ptr.h:144:19: note: forward declaration of 
     'std::__exception_ptr::type_info' 
     const class type_info* 
       ^
1 error generated. 
$ 

प्रश्न: मैं इसे क्लैंग के साथ कैसे ठीक करूं? या क्या मुझे कुछ याद आ रहा है और क्लैंग कोड को अस्वीकार करने का अधिकार है?

+2

के लिए तय हो गई है आप 'नहीं के साथ std :: type_info' लेकिन' एसटीडी के साथ समस्या है :: __ exception_ptr :: type_info', जो होने के लिए की तरह लगता है जीसीसी विशेष। –

+3

आप गैर मानक कार्यों का उपयोग कर रहे हैं, आप क्या उम्मीद करते हैं? – Pubby

+0

मैं libC++ का उपयोग नहीं कर रहा हूं, लेकिन libstdC++ (जैसा कि आप त्रुटि संदेश में पथ से देख सकते हैं)। और 'std :: __ upgrade_ptr :: type_info' वास्तव में गलत तरीके से बनाई गई अग्रेषित घोषणा है क्योंकि क्लैंग 'std :: type_info' नहीं लेता है क्योंकि आप त्रुटि संदेश के शीर्षलेख में चेक कर सकते हैं। और गैर मानक ... अच्छा ... असली दुनिया सही नहीं है। यह कोड-बेस का हिस्सा है जिसे मैं क्लैंग में भेज रहा हूं। मैं बस कुछ रचनात्मक मदद की उम्मीद कर रहा था। ओएस एक्स पर –

उत्तर

4

@ हावर्ड हिन्नेंट की टिप्पणी के लिए धन्यवाद, मैंने समस्या को ठीक करने में कामयाब रहे। प्रीप्रोसेसर आउटपुट में समस्या स्पष्ट हो गई: libstdC++ में <type_info> से घोषितstd::type_info से पहले भी शामिल हो गया। इसने क्लैंग को std::__exception_ptr::type_info पर एक नई अग्रेषण घोषणा की। समाधान यह गैर कानूनी है के रूप में सरल है:

namespace std { class type_info; } 

#include <typeinfo> 
#include <exception> 

const char* get_name(const std::exception_ptr eptr) 
{ 
    return eptr.__cxa_exception_type()->name(); 
} 

int main() {} 

लगता है जैसे मैं जाँच करनी चाहिए अगर libstdC++ पहले से ही उस के लिए एक बग रिपोर्ट है और, अगर नहीं, एक बनाएँ।

अद्यतन: बग #56468 अब जीसीसी 4.7.3+

+0

आह, अच्छा ol 'implied 'type_info' libstdC++ में। – Xeo

+0

@Xeo: मुझे आपकी टिप्पणी से लगता है कि g ++ मानता है कि घोषणा के बिना 'std :: type_info' नाम का एक प्रकार है? जो मेरा जवाब देता है 'यह काम g ++' सवाल अच्छी तरह से क्यों करता है। –

+0

जीसीसी बस स्पष्ट रूप से 'std :: type_info' घोषित करता प्रतीत होता है। क्लैंग और libstdC++ के साथ एक सामान्य हैलो वर्ल्ड करते समय आप पहली बार इस समस्या का सामना करते हैं। – Xeo