2012-01-13 17 views
8

मैं एक सी ++ नौसिखिया हूँ। आज, मैं एक समस्या है:सी ++ त्रुटि: सदस्य घोषणा नहीं मिली

template<class T> Ptr_to_const<T>& Ptr_to_const<T>::operator=(
     const Ptr_to_const<T> & p) { 
     ... 
    return *this; 
} 

जब संकलित, संकलक हमेशा कहते हैं:

template<class T> class Ptr_to_const { 
private: 
    Array_Data<T>* ap; 
    unsigned sub; 

public: 
     ... 

    Ptr_to_const<T> & operator=(const Ptr_to_const<T> & p); 

}; 

और स्रोत फ़ाइल में, मैं के रूप में कार्यक्रम: 'सदस्य हेडर फाइल में , मैं एक वर्ग को परिभाषित घोषणा नहीं मिली '। क्यों?

मैं उपयोग ग्रहण CDT + Cygwin जीसीसी

बहुत बहुत धन्यवाद!

+1

AFAIK आपको किसी स्रोत फ़ाइल में टेम्पलेट क्लास को लागू नहीं करना चाहिए। शीर्षलेख में फ़ंक्शन की परिभाषा सेट करें। – Lucian

उत्तर

6

टेम्पलेट कक्षाओं को शीर्षलेख में घोषित और परिभाषित करने की आवश्यकता है, या अन्य फाइल जो उपयोगकर्ताओं द्वारा शामिल की गई है। उन्हें एक शीर्षलेख में घोषित नहीं किया जा सकता है और सामान्य रूप से स्रोत फ़ाइल में परिभाषित किया जा सकता है।

तर्क यह है कि टेम्पलेट को वास्तविक प्रकार के साथ प्रतिस्थापित किया जाना चाहिए और उपयोग किए जाने पर संकलित और संकलित के लिए स्रोत, और संकलक निश्चित रूप से आने वाले प्रत्येक संभावित प्रकार के लिए टेम्पलेट्स को प्रीकंपाइल नहीं कर सकता है, इसलिए उपयोगकर्ताओं को इसकी आवश्यकता है इसे संभालने में सक्षम हो (और इसलिए, कोड तक पहुंच की आवश्यकता है)।

यह ऑब्जेक्ट पास करते समय कुछ समस्याएं पैदा करता है, यदि एकाधिक पुस्तकालयों में समान टेम्पलेट्स शामिल होते हैं, क्योंकि उन्हें शीर्षलेख के विभिन्न संस्करणों के विरुद्ध संकलित किया जा सकता है (एक परिभाषा नियम देखें)।

0

आप हेडर फाइल के अंत में अपने स्रोत फ़ाइल को शामिल करना चाहिए या आप हेडर फाइल में सदस्य फ़ंक्शन को निर्धारित है जब आप एक टेम्पलेट वर्ग

1

"सदस्य नहीं मिला घोषणा" को परिभाषित ग्रहण स्थिर विश्लेषण द्वारा उत्पादित एक त्रुटि है उपकरण (codan) कंपाइलर के बजाए। अगर आपको यह त्रुटि मिलती है, लेकिन संकलन सफल होता है तो यह एक झूठी सकारात्मक है। इस उपकरण के पुराने संस्करण कुछ झूठी सकारात्मक देने के लिए जाने जाते हैं, उदाहरण के लिए this bug report देखें। तो मैं सबसे हालिया संस्करण में ग्रहण सीडीटी अद्यतन करने की सलाह देते हैं। अगर इससे मदद नहीं मिलती है, तो ग्रहण सीडीटी को बग रिपोर्ट जमा करें।

हालांकि, अगर आपको संकलक से भी त्रुटियां मिलती हैं (इन्हें समस्या दृश्य में टाइप कॉलम में सी/सी ++ समस्या द्वारा इंगित किया जाता है) तो आप शायद हेडर फ़ाइल को शामिल करना भूल गए हैं।

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