2012-06-27 32 views
8

मैं इस कोड है: यदि मैं एक ही टेम्पलेट 'हस्ताक्षर' के साथ एक टेम्पलेट समारोह के रूप में foo() बनानेडिफ़ॉल्ट टेम्पलेट पैरामीटर: संकलक टेम्पलेट तर्क निर्दिष्ट नहीं करने के बारे में शिकायत क्यों करता है?

struct A{}; 

template<class T = A> 
struct B { 
    void foo() {} 
}; 

B b; //Error: missing template arguments before 'b' 
    //Error: expected ';' before 'b' 
    //More errors 
b.foo() 

, संकलक टेम्पलेट तर्क को निर्दिष्ट नहीं के बारे में शिकायत नहीं करता है:

struct A {}; 

struct B { 
    template<class T = A> 
    void foo() {} 
}; 

B b; //OK 
b.foo() 

तो मुझे एक डिफ़ॉल्ट पैरामीटर के साथ टेम्पलेट क्लास के लिए तर्क निर्दिष्ट करने की आवश्यकता क्यों है, लेकिन टेम्पलेट फ़ंक्शन के लिए नहीं? क्या मुझे कुछ सूक्ष्मता है जो मुझे याद आ रही है?

कारण निश्चित रूप से टेम्पलेट तर्क कटौती विफलता के कारण है। लेकिन मैं जानना चाहता हूं क्यों।

+0

क्या इस प्रश्न के शीर्षक से कोई शब्द गायब है? – Pointy

+0

हां। शब्द याद किया - शिकायत। इसे जोड़ा गया – badmaash

+0

* संभावित टेम्पलेट्स के लिए डिफ़ॉल्ट टेम्पलेट तर्क [http://stackoverflow.com/questions/2447458/default-template-arguments-for- कार्यक्षमता- टेम्पलेट्स) * के संभावित डुप्लिकेट। –

उत्तर

7

सही सिंटैक्स इस (demo) है:

B<> b; 

डिफ़ॉल्ट तर्क A वर्ग टेम्पलेट B के लिए माना जाता है। <> भाग संकलक को बताता है कि B एक क्लास टेम्पलेट है और इसे डिफ़ॉल्ट पैरामीटर को टेम्पलेट तर्क के रूप में लेने के लिए कहता है।

+0

मैं देखता हूं। लेकिन टेम्पलेट फ़ंक्शन इसके बिना क्यों काम करता है: 'b.foo <>()'? – badmaash

+1

@ बदामाश: यह काम नहीं करता है: http://ideone.com/QhWgJ – Nawaz

+0

मेरा बुरा। जी ++ 4.7.0 का उल्लेख किया जाना चाहिए जिसमें कार्यों के लिए डिफ़ॉल्ट टेम्पलेट पैरामीटर के लिए समर्थन है। तो उपरोक्त कोड निश्चित रूप से काम करता है। G ++ 4.7.0 के साथ चलने का प्रयास करें। – badmaash

0

क्योंकि आप कहना है कि B एक टेम्पलेट है है:

B<> b; 

यहां तक ​​कि जब आप तर्क के किसी भी निर्दिष्ट करने के लिए नहीं करना चाहती।

+0

असल में आपको उस कंपाइलर को बताने के लिए '<> 'की आवश्यकता है जिसे आप टेम्पलेट नहीं चाहते हैं, लेकिन डिफ़ॉल्ट तर्क के साथ टेम्पलेट का त्वरण। हालांकि वाक्यविन्यास सही है। –

1

सही सिंटैक्स, नवाज पहले से ही उल्लेख है:

B<> b; 

कारण यह है कि B टेम्पलेट है और B<> डिफ़ॉल्ट तर्क A के साथ टेम्पलेट का इन्स्टेन्शियशन है। लेकिन जब आप एक तत्कालता चाहते हैं तो आपको <> की आवश्यकता होती है।