मैं एक संभव डॉ का एक मेल प्रति मैं हाल ही में बाहर क्रिसमस पर यहां
निम्नलिखित कोड अच्छी तरह से बनाई है भेजा डाल देंगे?
template<typename T>
struct A {
A<T>();
};
कई compilers है कि मैं (बजना, जी ++ और comeau conline) का परीक्षण किया यह स्वीकार करते हैं। दरअसल 12.1 यह न करे नहीं करता है (A<T>
कि वर्ग का एक नाम है और एक typedef-नाम नहीं है), लेकिन 8.3p1 कहते
एक अयोग्य-आईडी एक declarator-आईडी में होने वाली छोड़कर एक सरल पहचानकर्ता होगा कुछ विशेष कार्य (12.3, 12.4, 13.5) की घोषणा ...
के लिए एक निर्माता एक विशेष सदस्य समारोह है, लेकिन पार संदर्भ की सूची 12.1 शामिल नहीं है। क्या इसका मतलब है कि उपरोक्त कोड खराब गठित है? या यह एक आकस्मिक चूक है?
यदि आप बाहर की परिभाषा में समान करते हैं, तो आप एक निर्माता को टेम्पलेट तर्क पास करने का प्रयास करेंगे। यह मान्य कोड है
struct A {
template<typename T> A();
};
template<> A::A<int>() { }
कल्पना का कहना है कि जब इंजेक्शन वर्ग के नाम एक योग्य नाम पर किया जाता है जब वर्ग (बस A::A
के रूप में) के दायरे में देख, तो जब नाम देखने समारोह/निर्माता के नाम को स्वीकार करता है , इंजेक्शन क्लास नाम संदर्भ का अनुवाद उस वर्ग के निर्माता (ओं) को हल करने के लिए किया जाएगा (यदि नाम लुकअप संदर्भ केवल प्रकार स्वीकार करता है, तो नाम इंजेक्शन क्लास नाम रहेगा, और कक्षा प्रकार को इंगित करेगा)। A::A
के बाद, नाम लुकअप पूरा हो गया है और निर्माता को उत्पन्न करता है। <int>
तब केवल टेम्पलेट तर्क सूची के रूप में पार्स किया जा सकता है। यदि आपके रचनाकारों के बीच कोई टेम्पलेट नहीं है, तो आपका कोड अमान्य होगा।
स्रोत
2011-12-26 19:42:21
एफडब्ल्यूआईडब्ल्यू, जीसीसी 4.6.1 पर भी बनाता है और चलाता है। – Mat
संभावित रूप से 12.1/1 के कारण: "वाक्यविन्यास का उपयोग करता है ... कन्स्ट्रक्टर का वर्ग नाम ...", यह प्रश्न "Foo' वर्ग का नाम है? " –
@SteveJessop: ... "और, यदि हां, तो परिभाषा में इसे क्यों स्वीकार नहीं किया जाता है?" –