c++ - static member of class template error -


मुझे इस कोड स्निपेट के साथ समस्या है:

  टेम्पलेट & lt; typename T & gt; संरचना एस {स्थिर इंट ए; }; टेम्पलेट & lt; typename T & gt; डेल्टाइप (एस एंड एलटी; टी एंड जी; ए: ए) एस एंड टीटीओ; ए: ए;   

घनक 3.4 का कहना है:

  s.cpp: 8: 25: त्रुटि: 'ए' के ​​साथ एक परिभाषा विभिन्न प्रकार: 'डेल्टाइप (एस एंड एलटी; टीएसी: ए ए)' बनाम 'इंट' डेल्टाप्टेप (एस एंड एलटी; टी एंड जी; :: ए) एस एंड एलटी; टी एंड ए: :: ए; ^ S.cpp: 4: 14: नोट: पिछली परिभाषा यहाँ स्थिर इंट ए है; ^ 1 त्रुटि उत्पन्न हुई।   

लेकिन जीसीसी -4.8.2 स्वीकार करता है कम्पाइलर्स में से कौन सा सही है? क्या मुझे भविष्य में ऐसे कोड से बचना चाहिए?

क्लैंग मांग कर रहा है कि परिभाषा टेम्पलेट परिभाषा पर घोषणा से मेल खाती है समय, जबकि जीसीसी और दूसरों को तत्काल समय तक मिलान करना (जो आपके उदाहरण के लिए कभी भी नहीं होता है)।

क्लैग इस स्वीकार करता है:

  #include & lt; type_traits & gt; टेम्पलेट & lt; typename T & gt; संरचना एस {स्थिर इंट ए; }; टेम्पलेट & lt; typename T & gt; typename std :: enable_if & lt; सच्चे, इंटीग्रेटेड & gt; :: प्रकार एस & lt; T & gt; :: ए; // तात्कालिकता से पहले हल करता है   

लेकिन यह छोटा परिवर्तन अस्वीकार करता है:

  टेम्पलेट & lt; typename T & gt; typename std :: enable_if & lt; std :: is_same & LT; टी, टी & gt; :: मान, इंट & gt; :: प्रकार एस एंड एलटी; टी & gt; :: ए;   

मुझे ऑब्जेक्ट घोषित करने के संबंध में मानक कहां याद नहीं होता है, लेकिन मुझे संदेह है कि कोड को अस्वीकार करने के दाग़ के अधिकार में है। मानक का इरादा, यदि मुझे सही ढंग से याद आती है, तो यह है कि प्रत्येक घोषणा बिल्कुल एक परिभाषा से मेल खाती है, और उस मानचित्रण को तत्काल समय से पहले निर्धारित किया जा सकता है।

पराजित शासन के साथ जीसीसी स्पष्ट रूप से आवेदन कर रहा है, दो सदस्य घोषणाओं और दो परिभाषाएं, लेकिन प्रत्येक परिभाषा टेम्पलेट पैरामीटर के आधार पर घोषणाओं में से किसी एक को अंतिम रूप दे सकती है।

जो कोड जीसीसी और एमएसवीसी स्वीकार कर रहा है वह बीमार है, कोई निदान नहीं है ?? | लंबित खोज वास्तविक मानिकों को कहीं § 3 [मूल], एक 7 [डीसीएलडीसीएल], एक 8 (डीसीएलएडीसीएल), एक 14 [अस्थायी], या शायद कहीं और में दफन कर दिया गया।


मुझे अभी भी पता नहीं है कि किस नियम से पूर्ववर्ती घोषणापत्रों के लिए ऑब्जेक्ट की परिभाषा मिलती है, लेकिन § 14.4 / 2 यह निर्धारित करता है कि decltype (â ??) | समतुल्य नहीं हो सकता (मैं घोषणात्मक अर्थों में ग्रहण करता हूं) int

यदि कोई अभिव्यक्ति में एक टेम्पलेट पैरामीटर शामिल है, तो decltype (e) एक अद्वितीय निर्भर ty पीई। दो ऐसे डेल्टाइप-स्पेसिअर्स एक ही प्रकार का संदर्भ केवल तभी करें जब उनके एक्सप्रेशंस समकक्ष (14.5.6.1) हैं। [ नोट: हालांकि, इसे एक स्थान पर रखा जा सकता है, उदाहरण के लिए, typedef-name। â ???? अंत नोट ]

मुझे पूरा यकीन है कि घोषणा के अनुरूप परिभाषा के लिए सममूल्यन, मात्र अलियासिंग नहीं आवश्यक है। § 14.5.6.1 इस क्षेत्र में काफी गहराई से विचार करता है, सिवाय इसके कि वह विशेष रूप से फ़ंक्शन हस्ताक्षर की चर्चा कर रहा है।

Comments

Popular posts from this blog

Java - Error: no suitable method found for add(int, java.lang.String) -

java - JPA TypedQuery: Parameter value element did not match expected type -

c++ - static template member variable has internal linkage but is not defined -