2012-05-24 12 views
7

निम्न कोड संकलित नहीं कर सकता - अविकसित पहचानकर्ता का उपयोग। मैं संकलन के लिए जीसीसी और एक्सकोड का उपयोग करता हूं।टेम्पलेट्स और विरासत के साथ सी ++ में अविकसित पहचानकर्ता का उपयोग

सबकुछ एक ही शीर्षलेख फ़ाइल में है।

include "MyArray.h" 

template <typename T> 
class MyBase { 
public: 
    MyBase(); 
    virtual ~MyBase(); 
    void addStuff(T* someStuff); 
protected: 
    MyArray<T*> stuff; 
}; 

template <typename T> 
MyBase<T>::MyBase() {} 
template <typename T> 
MyBase<T>::~MyBase() {} 

template <typename T> 
void MyBase<T>::addStuff(T* someStuff) { 
    stuff.add(someStuff); 
} 

// --------------------- 

template <typename T> 
class MyDerived : public MyBase<T> { 
public: 
    MyDerived(); 
    virtual ~MyDerived(); 
    virtual void doSomething(); 
}; 

template <typename T> 
MyDerived<T>::MyDerived() {} 
template <typename T> 
MyDerived<T>::~MyDerived() {} 

template <typename T> 
void MyDerived<T>::doSomething() { 
    T* thingy = new T(); 
    addStuff(thingy); //here's the compile error. addStuff is not declared. 
} 

क्या किसी के पास कोई स्पष्टीकरण है? अग्रिम धन्यवाद!

+0

@jua addStuff विधि आह्वान करने के लिए इस सूचक आपको निश्चित रूप से अयोग्य नामों के बारे में शापित आश्रित बेस लुकअप नियमों को देखने की आवश्यकता है। आप जो कहते हैं वह गलत है। एक अनुरूप कंपेलर की आवश्यकता होगी। –

उत्तर

14

कोशिश

this->addStuff(thingy); 
+1

हाँ, यह-> यह है;) – user1414745

+0

@juanchopanza: वास्तव में, यह सही है, क्योंकि संकलक _know_ नहीं है कि यह निर्भर है। –

+1

@moo यह निश्चित रूप से * निर्भर है * * * तत्कालता पर देखा जाएगा। –

5

कई मुद्दों के होते हैं:

  1. वर्ग परिभाषाओं के बाद अर्धविराम गुम।
  2. doSomething विधि घोषणा/परिभाषा के लिए गुम प्रकार।
  3. addStuff विधि की परिभाषा के लिए गुम प्रकार।

it seems to work को ठीक करने के बाद।

संपादित करें: जैसा कि आपने वाक्यविन्यास त्रुटियों को ठीक किया है और यह अभी भी काम नहीं करता है। दूसरों के रूप में सुझाव दिया है अपने संकलक this-> उपसर्ग के साथ addStuff विधि कॉल करने के लिए कह सकता है:

this->addStuff(thingy); 
+1

मुझे लगता है, यह मानक के रूप में काम नहीं करना चाहिए। 'यह->' भाग यहां एक आवश्यकता है। – Nawaz

+0

@ नवाज: एमएसवीसी -2010 भी काम करता है। क्या आप मानक से उद्धरण पोस्ट कर सकते हैं क्यों इसे काम नहीं करना चाहिए? –

+0

@ नवाज: नहीं, इस मामले में इसकी आवश्यकता नहीं है। विवरण के लिए अपने उत्तर पर मेरी टिप्पणी देखें। –

2

यह टेम्पलेट विरासत की वजह से है। इस तरह के मामले में आप mannualy आधार तरीकों के लिए उपयोग कर निर्दिष्ट करना चाहिए:

template <typename T> 
MyDerived<T>::doSomething() { 
    using MyBase<T>::addStuff; 
    T* thingy = new T(); 
    addStuff(thingy); 
} 

या इस सूचक द्वारा यह कार्य करें:

template <typename T> 
MyDerived<T>::doSomething() { 
    T* thingy = new T(); 
    this->addStuff(thingy); 
} 
संबंधित मुद्दे