2010-04-06 13 views
6

से घोंसला वाले आंतरिक वर्ग में वापसी सूचक I C++ के लिए नया हूं, इसलिए मेरे साथ भालू। मेरे पास ए जे नामक एक सामान्य वर्ग है जिसे बी ए नामक एक नेस्टेड क्लास है जिसे GetB() नामक एक विधि है, जिसे बी का एक नया उदाहरण वापस करना है। हालांकि, मुझे संकलित करने के लिए मेरा कोड नहीं मिल सकता है। यहाँ यह क्या लगता है जैसे: # शामिलजेनेरिक बाहरी वर्ग

आह

template <class E> 
class A { 

public: 
    class B { 
    public: 
     int data; 
    }; 

    B * getB(); 
}; 

A.cpp

#include "A.h" 

template <class E> 
A<E>::B * A::getB() { 
    return new B(); 
} 

जब मैं इस संकलन करने का प्रयास करें, मैं निम्नलिखित त्रुटि मिलती है:

error: expected constructor, destructor, or type conversion before '*' token 

क्या कोई जानता है कि मैं क्या गलत कर रहा हूं?

धन्यवाद,

helixed

अद्यतन:

त्वरित उत्तर हर किसी के लिए धन्यवाद। मुझे अभी भी यह काम करने में थोड़ी परेशानी हो रही है।

A.h

template <class E> 
class A { 

public: 
    class B { 
    public: 
     int data; 
    }; 

    B * getB(); 
}; 

template <class E> 
typename A<E>::B * A<E>::getB() { 
    return new B(); 
} 

class C { 

}; 

हालांकि, जब मैं मुख्य से इस्तेमाल करने की कोशिश, मैं कोई त्रुटि मिलती है: यहाँ सूचीबद्ध सुझाव लेने के बाद, मैं कुछ इस तरह की है। यहाँ मेरी मुख्य विधि है:

main.cpp

#include "A.h" 

int main(int argc, char *argv[]) 
{ 
    A<C> *a = new A<C>(); 
    A<C>::B *b = a.getB(); 
} 

जब मैं इस संकलन करने का प्रयास करें, मैं निम्नलिखित त्रुटि मिलती है: त्वरित प्रतिक्रिया के लिए फिर से

error: request for member 'getB' in 'a', which is of non-class type 'A<C>*' 

धन्यवाद।

helixed

+3

हम्म, Comeau पर काम करता है ।लेकिन अगर यह संकलित भी है, तो क्या इससे मदद मिलेगी? GetB के लिए परिभाषा केवल A.cpp में उपलब्ध होगी। चूंकि यह एक टेम्पलेट है, तब तक इसे किसी अन्य अनुवाद इकाई से नहीं बुलाया जा सकता है जब तक कि आपका कंपाइलर "निर्यात" का समर्थन नहीं करता। –

+2

संपादन का जवाब: सूचक के माध्यम से सदस्य पहुंच के लिए '->' का उपयोग करें। –

+0

ओह, दुह, मैं अब वास्तव में बेवकूफ महसूस करता हूं। मैंने जावा में बहुत अधिक समय बिताया है। मदद स्टीव के लिए धन्यवाद। – LandonSchropp

उत्तर

7

संकलक बहुत चालाक लगाने की है कि "बी" एक प्रकार जब 'ए' टेम्प्लेट की गई है नहीं है। टाइपनाम का उपयोग करने का प्रयास करें।

template <class E> 
typename A<E>::B * A<E>::getB() { 
    return new B(); 
} 
+0

और जैसा स्टीव जेसॉप ने उल्लेख किया है, इसे .h फ़ाइल में रखें, न कि .cc फ़ाइल पर। – Stephen

+0

यह मूल समस्या को ठीक करने लग रहा था। हालांकि, मुझे अभी भी कुछ परेशानी हो रही है, जैसा कि मैंने ऊपर पोस्ट किया है। सहायता के लिए धन्यवाद। – LandonSchropp

+0

उपयोग करें: "ए :: बी * बी = ए-> getB();" आपको "ए" पॉइंटर को हटाना होगा। – Stephen

2

आप अपने परिभाषा typename उपयोग करने के लिए संकलक कि बी एक प्रकार है करने के लिए संकेत की जरूरत है।

template <class E> 
typename A<E>::B * A::getB() { 
    return new B; 
} 
+0

मैं आपका पॉइंट देखता हूं। मैंने परिभाषा को एएच फ़ाइल में स्थानांतरित कर दिया है। धन्यवाद। – LandonSchropp

0

अद्यतन करने के लिए उत्तर:

आप सी ++ में new सब कुछ करने की जरूरत नहीं, वास्तव में, यह सबसे अच्छा होगा यदि आप नहीं किया था, उसके बाद से आप स्पष्ट रूप से delete स्मृति आवंटित करने के लिए होगा या स्मार्ट पॉइंटर्स का उपयोग करें।

तो, यहाँ अपने कोड में संशोधन किया जाता है:

template <class E> 
class A { 

public: 
    class B { 
    public: 
     int data; 
    }; 

    B getB(); // Object, not pointer 
}; 

template <class E> 
typename A<E>::B A<E>::getB() { 
    return B(); 
} 

#include "A.h" 

int main(int argc, char *argv[]) 
{ 
    A<C> a = A<C>(); 
    A<C>::B b = a.getB(); 
} 

आप new को A<C> वर्ग चाहते हैं, तो आप operator-> का उपयोग करने के तरीकों को लागू करने की जरूरत है:

A<C>::B b = a->getB(); 
संबंधित मुद्दे