2010-10-17 13 views
18

मुझे त्रुटि मिली <: g ++ कंपाइलर पर टेम्पलेट तर्क सूची प्रारंभ नहीं कर सकता। कोड<: टेम्पलेट तर्क सूची शुरू नहीं कर सकता

template<typename T> class SomeClass; 
class Class; 

SomeClass<::Class>* cls; 
+1

नई standrard (C++ 0x) के मुद्दे को संबोधित >> तरह से आया है। क्या यह इस मुद्दे को भी संबोधित नहीं करता है? संयोग से, माइक्रोसॉफ्ट कंपाइलर्स इस पर त्रुटि नहीं देते हैं (मुझे पता है कि वे तकनीकी रूप से चाहिए, लेकिन यह अच्छा है कि वे नहीं करते हैं) –

+0

@ अरमेन टीरुनियन हाँ, यह सी ++ 0x में तय किया गया था जो सी ++ 11 बन गया था, हालांकि फिक्स '>>' धारा 14.3' में किया गया था जो '<::' के लिए ठीक से अलग है जो अधिकतम नियम का संशोधन है। तो काम पर दोनों कष्टप्रद लेकिन विभिन्न मूल मुद्दे। मैं अपने जवाब में यह विस्तार से। समरूपता पसंद करने के लिए –

उत्तर

33

Maximal Munch tokenization principle एक वैध सी ++ टोकन जमा करना होगा/के अनुसार यथासंभव अधिक से अधिक लगातार वर्ण की है।

<:digraph (प्रतीक [ का एक वैकल्पिक प्रतिनिधित्व) है।

      Digraph Equivalent 
           <:   [ 
           :>   ] 
           <%   { 
           %>   } 
           %:   # 

तो SomeClass<::Class>* cls;SomeClass[:Class>* cls; जो किसी भी मतलब नहीं है के रूप में व्याख्या की है।

समाधान: < और :

SomeClass< ::Class>* cls; 
      ^
      | 
      White Space 
11

के बीच एक खाली स्थान के जोड़े बजाय निम्नलिखित का प्रयास करें:

SomeClass< ::Class>* cls; 

आप द्वि आलेख के बारे में this सवाल में अधिक जानकारी पा सकते हैं। This ट्रिग्राफ के बारे में प्रश्न भी उपयोगी हो सकता है।

< पात्रों को
2

रखें रिक्त स्थान:

SomeClass <::Class> * cls; 

आप केवल वास्तव में < अलग और की जरूरत है:, लेकिन मैं समरूपता की तरह।

+0

प्लस वन – Mawg

7

सी ++ 11 के साथ इस प्रश्न का उत्तर थोड़ा सा बदल जाता है।

पूर्व सी ++ 11

पिछला सी ++ 11 maximal munch rule जो अस्पष्टता से बचने के लिए शाब्दिक विश्लेषण में इस्तेमाल और के रूप में यह एक वैध टोकन इस वजह से बनाने के लिए कर सकते हैं के रूप में कई तत्वों लेने के द्वारा काम करता है के लिए:

<: : 

<: एक digrap है:

<:: 

के रूप में निम्नलिखित टोकन उत्पन्न करने के लिए ज [ करने के लिए अनुवाद और इसलिए आप के साथ खत्म हो जो:

SomeClass[:Class>* cls; 

जो मान्य कोड नहीं है।

हम पुष्टि कर सकते हैं कि इस मानक खंड 2.4Preprocessing मसौदा सेल्सियस तक ++ जाकर मामला है टोकन जो कहते हैं: इनपुट धारा पूर्व प्रसंस्करण में पार्स किया गया है

तो एक दिया चरित्र अप करने के लिए टोकन , अगली प्रीप्रोकैसिंग टोकन वर्णों का सबसे लंबा अनुक्रम है जो प्रीप्रोकैसिंग टोकन का गठन कर सकता है, भले ही जो आगे के व्याख्यात्मक विश्लेषण को विफल कर दे।

और निम्नलिखित शास्त्रीय अधिक से अधिक मंच प्रश्न सहित उदाहरण के एक जोड़े प्रदान करता है:

[उदाहरण: कार्यक्रम टुकड़ा एक्स +++++ y एक्स ++ ++ + y के रूप में पार्स किया जाता है, , यदि एक्स और वाई अंतर्निहित प्रकार हैं, तो वृद्धि ऑपरेटर पर बाधा का उल्लंघन करता है, भले ही पार्स x ++ +++ y सही अभिव्यक्ति उत्पन्न कर सकता है। अंत उदाहरण]

सी ++ 11

सी ++ 11 इस परिवर्तन में, एक नियम के इस मामले के लिए काट कर बनाया गया और draft C++11 standard निम्नलिखित कहा: अन्यथा

, यदि अगले तीन वर्ण < :: और बाद के चरित्र न तो हैं: न ही> < को प्रीप्रोसेसर टोकन के रूप में माना जाता है और वैकल्पिक टोकन के पहले अक्षर के रूप में नहीं <:।

अनुभाग के लिए

2.5Preprocessing टोकन। तो यह कोड अब सी ++ 11 में उत्पादन और त्रुटि नहीं करेगा।

यह परिवर्तन> एक में defect report: 1104

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