2012-04-21 16 views
16

मुझे एहसास है कि पहले से ही ऐसे प्रश्न पूछे गए हैं, लेकिन मैंने उनमें से कुछ को पढ़ा है और अभी भी यह नहीं देख रहा कि मैं कहां गलत हूं। जब मैं परिभाषा से प्रोटोटाइप को अलग किए बिना अपनी कक्षा लिखता हूं, तो सब कुछ ठीक काम करता है। समस्या होता है जब मैं प्रोटोटाइप और परिभाषा अलग रूप में नीचे दिखाया गया है:"टेम्पलेट पैरामीटर के बिना प्रयोग किया जाता है"

template<class T> class VisitedSet { 
public: 
    VisitedSet(); 
    int getSize(); 
    void addSolution(const T& soln); 
    void evaluate(); 
private: 
    vector<T> vec; 
    int iteration; 
}; 

और एक परिभाषा का एक उदाहरण है कि मुझे इस त्रुटि देता है के रूप में:

int VisitedSet::getSize() { 
    return vec.size(); 

मैं पहले एक टेम्प्लेटेड वर्ग बनाया कभी नहीं किया है , तो कृपया मुझे माफ़ कर दो अगर समस्या यहां मामूली है।

+0

नोट: ज्यादातर मामलों में आप हेडर में टेम्पलेट सदस्य कार्यों की परिभाषाओं को परिभाषित करना चाहते हैं। यदि परिभाषा शीर्षलेख में हैं, तो उन्हें 'इनलाइन' (या उन्हें टेम्पलेट श्रेणी परिभाषा के अंदर परिभाषित करें) के रूप में चिह्नित करना याद रखें, यदि वे नहीं हैं, तो दो बार सोचें और सुनिश्चित करें कि आपको शीर्षलेख में परिभाषाओं की आवश्यकता नहीं है (आप करते हैं यदि आप स्पष्ट रूप से अनुवाद इकाई में तत्काल प्रारंभ करते हैं जिसमें * सभी * प्रकारों के लिए परिभाषा शामिल है, जिसके साथ आप टेम्पलेट का उपयोग करना चाहते हैं) शीर्षलेख में परिभाषाओं की आवश्यकता नहीं है। मुझे डर है कि आप इसे जल्द से जल्द प्राप्त करने जा रहे हैं ... –

उत्तर

28

VisitedSet, एक टेम्पलेट, नहीं एक वर्ग है VisitedSet::getSize() के रूप में।

template<class T> 
int VisitedSet<T>::getSize() { 
//   ^^^ 
    return vec.size(); 
} 

एक टेम्पलेट का नाम, फिर भी, इस्तेमाल किया जा सकता है जैसे कि यह एक वर्ग थे भीतर: बस के रूप में आप सभी class T के लिए class VisitedSet<T> की घोषणा निर्दिष्ट, आप सभी class T के लिए VisitedSet<T>::getSize() की परिभाषा का उल्लेख करना होगा एक टेम्पलेट परिभाषा:

template<class T> 
struct Example { 
    Example* parent; 
    T x, y; 
}; 

इस मामले में, ExampleExample<T> के लिए कम है।

0

कोशिश VisitedSet के कार्यान्वयन ऊपर

template <typename T> 

डाल :: getSize() - लेकिन सावधान रहना है कि, में सामान्य, टेम्प्लेट की गई वर्गों और कार्यों सब inlined जाना चाहिए। अधिक जानकारी के लिए C++ faq here देखें।

template <class T> 
int VisitedSet<T>::getSize() { 
    return vec.size(); 
} 
+0

जब मैंने 'intviewSet :: getSize() {' के साथ लाइन के ऊपर 'टेम्पलेट ' रखा है, तो मुझे ठीक वही त्रुटि मिलती है। क्या यह पसंद है कि ** ** ** परिभाषा से प्रोटोटाइप अलग नहीं है? क्या इस संदर्भ में इनलाइनिंग का मतलब क्या है? – synaptik

+0

@synaptic आपको कक्षा में टेम्पलेट तर्क का भी उपयोग करने की आवश्यकता है क्योंकि दूसरे ने अन्य उत्तरों में सुझाव दिया है। –

3

आप इस चाहते हैं। उदाहरण के लिए, कुछ पैरामीटर प्रकारों के लिए विशेषज्ञता हो सकती है।

2

आप परिभाषा टेम्पलेट पैरामीटर राज्य के लिए के रूप में अच्छी

template<class T> 
int VisitedSet<T>::getSize() { 
    return vec.size(); 
} 

है अन्यथा संकलक यह घोषणा करने के लिए मेल नहीं कर सकते हैं:

+0

मैं देखता हूं। सबको धन्यवाद। – synaptik

2

आप अपने संकलक जाने की जरूरत है पता है कि तुम टेम्पलेट समारोह में एक विधि को लागू कर रहे हैं: तो तुम एक नेस्टेड नाम विनिर्देशक ऐसे में VisitedSet उपयोग नहीं कर सकते

template<typename T> 
int VisitedSet<T>::getSize() { 
    return vec.size(); 
} 
संबंधित मुद्दे