2015-08-19 5 views
5

मैंने टेम्पलेट का उपयोग करके किसी भी प्रकार की ऑब्जेक्ट को स्वीकार करने के लिए फ़ंक्शन में एक पैरामीटर बदल दिया है, लेकिन मैं इसका उपयोग अन्य डिफ़ॉल्ट पैरामीटर के साथ नहीं कर सकता, क्या मुझे कुछ याद आ रही है?मेरे पास टेम्पलेट और डिफ़ॉल्ट तर्क क्यों नहीं हो सकते हैं?

#include <string> 
#include <iostream> 

class MyClass { 
    public: 
    std::wstring msg = L"hey"; 
    MyClass(){}; 
}; 

class MyClass2{ 
    public: 
    template<class T> MyClass2(T* t, int i); 
}; 
template<class T> 
MyClass2::MyClass2(T* t,int i=0){ std::wcout << t->msg << std::endl; } 

int main(int argc, char **argv) 
{ 
    MyClass mc; 
    MyClass2 mc2(&mc); 
    return 0; 
} 

आउटपुट:

practice.cpp:16:32: error: redeclaration of 'MyClass2::MyClass2(T*, int)' may not have default arguments [-fpermissive] 

मैंने सोचा कि यह टेम्पलेट में डिफ़ॉल्ट मान का उपयोग नहीं करने के लिए उचित था, लेकिन वहाँ अन्य पैरामीटर के लिए एक कारण है?

उत्तर

17

आप निश्चित रूप से can; घोषणा पर डिफ़ॉल्ट तर्क डालें, परिभाषा नहीं।

घोषणा की के बजाय परिभाषा के तर्क सूची में डिफ़ॉल्ट लाना एक अतिरिक्त अतिरिक्त कि समारोह टेम्पलेट्स के लिए उपलब्ध नहीं है:

[C++14: 8.3.6/4]: गैर टेम्पलेट कार्यों के लिए, डिफ़ॉल्ट तर्क बाद में घोषणाओं में जोड़ा जा सकता है एक ही क्षेत्र में एक समारोह के। [..]

मैं वास्तव में नहीं जानता कि क्यों इस प्रतिबंध जगह में है।

इसी प्रकार के नियम:

[C++14: 8.3.6/6]: वर्ग टेम्पलेट्स के सदस्य कार्यों के अलावा, एक सदस्य समारोह परिभाषा यह है कि वर्ग परिभाषा के बाहर दिखाई देता है सदस्य समारोह द्वारा प्रदान की डिफ़ॉल्ट तर्कों के सेट से जुड़ जाते हैं में डिफ़ॉल्ट तर्क कक्षा परिभाषा में घोषणा [..]

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

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