2011-12-26 26 views
6

पुराना जीसीसी 4.1.2 accepts, और नया जीसीसी 4.5.1 accepts, निम्न प्रोग्राम।क्या यह कन्स्ट्रक्टर घोषणा में टेम्पलेट प्रकार की पैरामीटर सूची लिखने के लिए मान्य है?

लेकिन क्या यह वास्तव में सही है? इस तरह के टेम्पलेट पैरामीटर के साथ एक कन्स्ट्रक्टर घोषित करने के बारे में मानक क्या कहता है?

(मैं इसे दिलचस्प है कि मैं do the same in the out-of-line definition करने की अनुमति नहीं कर रहा हूँ लगता है।)

#include <iostream> 
template <typename T> 
struct Foo { 
    Foo<T>(); // <--- 
}; 

template <typename T> 
Foo<T>::Foo() { 
    std::cout << ":)"; 
} 

int main() { 
    Foo<int> f; 
} 

कारण मैं पूछता हूँ कि यह this answer पर टिप्पणी है कि जीसीसी त्रुटि में यहां हो सकता है में प्रस्तावित किया गया है।

+0

एफडब्ल्यूआईडब्ल्यू, जीसीसी 4.6.1 पर भी बनाता है और चलाता है। – Mat

+3

संभावित रूप से 12.1/1 के कारण: "वाक्यविन्यास का उपयोग करता है ... कन्स्ट्रक्टर का वर्ग नाम ...", यह प्रश्न "Foo ' वर्ग का नाम है? " –

+0

@SteveJessop: ... "और, यदि हां, तो परिभाषा में इसे क्यों स्वीकार नहीं किया जाता है?" –

उत्तर

3

मैं एक संभव डॉ का एक मेल प्रति मैं हाल ही में बाहर क्रिसमस पर यहां

निम्नलिखित कोड अच्छी तरह से बनाई है भेजा डाल देंगे?

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> तब केवल टेम्पलेट तर्क सूची के रूप में पार्स किया जा सकता है। यदि आपके रचनाकारों के बीच कोई टेम्पलेट नहीं है, तो आपका कोड अमान्य होगा।

+0

पहला अनुच्छेद यह इंगित करता है कि दिया गया कोड मान्य है। लेकिन errr ... ओपी ने एक टेम्पलेट वर्ग के एक नियमित कन्स्ट्रक्टर के बारे में पूछा, एक टेम्पलेट कन्स्ट्रक्टर के बारे में नहीं। (' :: ए()' i.s.o. 'ए :: ए ()')। – xtofl

+0

@xtofl मुझे लगता है कि आपने मेरा जवाब गलत समझा। मेरे मेल की प्रतिलिपि के बाद, मैंने ओपी के सवाल के बारे में विस्तार से बताया "(मुझे यह दिलचस्प लगता है कि मुझे बाहर की परिभाषा में ऐसा करने की अनुमति नहीं है।)"। पहला अनुच्छेद (मेरे मेल का प्रतिनिधित्व करने वाला उद्धरण) यह दर्शाता है कि कोड जीसीसी, क्लैंग और आउटलो ऑनलाइन कंपाइलर द्वारा स्वीकार किया जाता है। यह इंगित नहीं करता है कि कोड मान्य है। –

+0

मुझे खेद है; मैं एक चालाक लड़का हूँ, लेकिन क्या आप इसे मेरे लिए सारांशित कर सकते हैं? –

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

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