2016-01-15 10 views
5

मैं C++ टेम्पलेट्स जानने के लिए कोशिश कर रहा हूँ नहीं है और मैं निम्नलिखित कोड है:टेम्पलेट और व्युत्पन्न वर्ग परिभाषा: त्रुटि: 'myClass' एक वर्ग, नाम स्थान, या गणन

#include <stack> 

template<typename T> 
class myClass : public std::stack<T>{ 
public: 
    myClass(void); 
    myClass(myClass const & src); 
    virtual ~myClass(void); 
    myClass & operator=(myClass const & rhs); 
}; 

template<typename T> 
myClass::myClass(void) : std::stack<T>(){ 
} 

लेकिन मैं कर सकते हैं ' टी यह पता लगाने जब मैं संकलन करने की कोशिश कारण है कि मैं निम्नलिखित मिल:

test.cpp:17:1: error: 'myClass' is not a class, namespace, or enumeration 
myClass::myClass(void) : std::stack<T>(){ 
^ 
test.cpp:8:9: note: 'myClass' declared here 
class myClass : public std::stack<T>{ 
     ^
1 error generated. 

यह समारोह की परिभाषा की तरह लग रहा त्रुटि होती है, लेकिन मैं नहीं जानता कि क्यों मैं इस त्रुटि मिलती है, यह मेरे लिए ठीक लग रहा है (भले ही मुझे लगता है कि यह वास्तव में ठीक नहीं है), बस एक वाक्यविन्यास त्रुटि शायद? ..

मैं क्लैंग ++ -Wall -Werror -Wextra -c के साथ संकलित करता हूं।

इस त्रुटि का कारण क्या हो सकता है?

+2

साइड ध्यान दें: एक समारोह कोई पैरामीटर 'myClass() है, बस का उपयोग करें यदि आप' void' निर्दिष्ट करने की आवश्यकता नहीं है, '। – user657267

+1

@ user657267 यह सच है, वास्तव में, लेकिन मुझे इसे अपने स्कूल में प्रोग्रामिंग शैली के कारण (मेरे स्कूल द्वारा पूछा गया, मैंने आदत ली है) के लिए इसका उपयोग करना है। – vmonteco

उत्तर

8

आपको इसके लिए टेम्पलेट पैरामीटर निर्दिष्ट करने की आवश्यकता है, क्योंकि myClass एक टेम्पलेट क्लास है।

template<typename T> 
myClass<T>::myClass(void) : std::stack<T>() { 
//  ~~~ 
} 

बीटीडब्ल्यू: : std::stack<T>() अनावश्यक प्रतीत होता है।

LIVE

+0

वह था! बहुत बहुत धन्यवाद, यह शायद एक बेवकूफ सवाल था, मेरा बुरा! क्या ऐसा इसलिए है क्योंकि संकलक को इस पैरामीटर को अपने सदस्य कार्यों को परिभाषित करने से पहले वर्ग को "instanciate" करने की आवश्यकता है? (हालांकि मैं गलत हो सकता हूं, मैं बस इसके उद्देश्य को समझने की कोशिश कर रहा हूं) – vmonteco

+0

@ vmonteco मुझे ऐसा नहीं लगता है। मुझे लगता है कि संकलक बस सोचता है कि 'myClass' का पालन किया जाना चाहिए' <> ', क्योंकि यह एक टेम्पलेट है। तो अलग-अलग कहा, कंपाइलर को 'myClass' नामक एक गैर-टेम्पलेट क्लास नहीं मिल सका। – songyuanyao

+0

@songyuanyo मैंने अभी पाया है कि अगर मैं इसे पैरामीटर के रूप में पास करता हूं तो भी यह आवश्यक है, तो मुझे लगता है कि यह कक्षा परिभाषा का एक प्रकार है? (शायद यह ** myClass ** -> टेम्पलेट और ** myClass ** -> टेम्पलेट के साथ बनाई गई कक्षा है?), (बीटीडब्ल्यू, "std :: stack ()" से आपका क्या मतलब है अनावश्यक है, मैं इस मामले में बिना कर सकता था? – vmonteco

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