2012-03-22 14 views
16

यहाँ के साथ विभाजन गलती, कोडआंतरिक संकलक त्रुटि: जी ++ 4.3.5

//fail_.cpp 
    template< unsigned char X, class L> 
    class A { 
     public: 
     typedef void (A::*fptr)(); 
     class B { 
      public: B(typename A< X, L> ::fptr); 
     }; 
    }; 
    template < unsigned char X, typename L > 
    A<X,L>::B::B (fptr) { } 

g++ -c fail_.cpp

fail_.cpp:11: internal compiler error: Segmentation fault
Please submit a full bug report, with preprocessed source if appropriate.
See < file:///usr/share/doc/gcc-4.3/README.Bugs > for instructions.

जी ++ 4.3.5 में मेरे लिए एक बग की तरह लग रहा है देता है जी ++ 4.4 और उच्चतर इस तरह के segfault नहीं देते हैं।

आप क्या सोचते हैं? क्या कोड के साथ कुछ गड़बड़ है?

+27

एक आंतरिक कंपाइलर त्रुटि हमेशा एक बग है। यदि कोड के साथ कुछ गड़बड़ है तो संकलक को वास्तविक त्रुटि संदेश उत्पन्न करना चाहिए, क्रैश नहीं। –

+0

मुझे ठीक लग रहा है। शायद मैंने आंतरिक वर्ग को 'कक्षा बी {सार्वजनिक: बी (fptr) में सरल बनाने की कोशिश की होगी; }; '। टाइपपीफ वहां दिखाई देनी चाहिए। –

+1

दिलचस्प बात यह है कि, यदि मैं * परिभाषा * में 'टाइपनाम ए < X, L> :: fptr' लिखता हूं, तो यह ठीक से संकलित करता है: http://ideone.com/0OOpn – Nawaz

उत्तर

-1

टाइपनाम को टेम्पलेट अनुभाग में कक्षा के प्रतिस्थापन के रूप में उपयोग किया जाना चाहिए।

आंतरिक कक्षा बी में, फ़ंक्शन पॉइंटर को पास करने के लिए कीवर्ड टाइपनाम की आवश्यकता नहीं होती है, क्योंकि < एक्स, एल> उस बिंदु पर संकलक के लिए पहले ही ज्ञात है।

और शायद टाइप के सामने टाइपनाम को संकलक को खराब करने का कारण बन रहा है (अपरिभाषित व्यवहार हो सकता है?)।

1

मुझे जीसीसी 4.2 के साथ एक समान विफलता दिखाई देती है। जैसा कि अन्य ने कहा है, एक आंतरिक त्रुटि का मतलब है कि कंपाइलर के अंदर कुछ बुरी तरह गलत हो गया है, जो नहीं है, यह दर्शाता है कि यह आपका कोड खराब था।

यह जी ++ 4.6 और क्लैंग 3.0 में ठीक काम करता है।

संबंधित मुद्दे