2012-04-20 15 views
5

मेरे होमवर्क असाइनमेंट के लिए, मुझे एक लिंक की गई सूची बनाना है और यह एक टेम्पलेट क्लास होना चाहिए। असाइनमेंट सूची नामक एक टेम्पलेट क्लास और लिंक नामक एक और नेस्टेड टेम्पलेट क्लास के लिए कॉल करता है।घोंसला वाले टेम्पलेट वर्गों को कैसे डिज़ाइन किया जाए जहां नेस्टेड क्लासेस एक ही प्रकार के

विधियों को कक्षा परिभाषा के बाहर परिभाषित किया जाना चाहिए।

मैंने पहले असाइनमेंट का एक सरल संस्करण बनाया और यह काम कर रहा है, लेकिन मुझे लगता है कि मेरे डिजाइन में कोई त्रुटि है।

#include <iostream> 
using namespace std; 

template <class T1> 
class A 
{ 
public: 
    template <class T2> 
    class B; 

    T1 _a; 
}; 

template <class T1> 
template <class T2> 
class A<T1>::B 
{ 
public: 
    T2 _b; 
}; 

int main() 
{ 
    A<int> a; 
    a._a = 5; 

    A<int>::B<int> b; 
    b._b = 10; 

    cout << a._a << " " << b._b << "\n"; 


    return 0; 
} 

मेरा मुख्य सवाल है, यह है, के बाद से नेस्टेड वर्ग एक ही प्रकार के हो जाएगा के रूप में आप बयान A<int>::B<int> b; से देख सकते हैं, वहाँ वर्ग बी के लिए एक तरह से स्वचालित रूप से एक के रूप में एक ही प्रकार के हो रहा है? क्या मेरा प्रश्न भी समझ में आता है? दूसरे शब्दों में, क्या मैं A<int>::B b; कर सकता हूं और बी स्वचालित रूप से ए के समान प्रकार कर सकता हूं? ऐसी स्थिति कभी नहीं होगी जहां उदाहरण के लिए A<double>::B<int>; होगा।

उत्तर

5

हां, बस B टेम्पलेट नहीं बनाएं। T1B की परिभाषा में अभी भी A के टेम्पलेट तर्क को संदर्भित किया गया है।

template <class T1> 
class A 
{ 
public: 
    class B; 

    T1 _a; 
} 

अब, A<int>::B<int> के बजाय, यह बस A<int>::B है।

List<int>::Link<double> वैसे भी समझ में नहीं आता है, इसलिए इसमें कोई टेम्पलेट नहीं है।

+0

ठीक है, मैं सोच रहा था कि काम करेगा, वहाँ रहा होगा एक समस्या (इसके अलावा, जबकि मुझे पता है यह सिर्फ एक उदाहरण है, मैं वर्गों लिखने के खिलाफ सार्वजनिक डेटा के सदस्यों के साथ सलाह देंगे) तब मेरे वाक्यविन्यास के साथ क्योंकि मुझे त्रुटियां मिल रही थीं। मैं इसे फिर से कोशिश करूंगा। –

1

मैं नहीं देख सकता कि आपको क्यों लगता है कि आपको अपनी आंतरिक कक्षा के लिए टेम्पलेट चाहिए। क्या आपने इसे गैर-टेम्पलेट वर्ग के रूप में घोषित करने का प्रयास किया है? जैसे

template <class T1> 
class A 
{ 
public: 
    class B; 
private:  
    T1 _a; 
}; 

template <class T1> 
class A<T1>::B 
{ 
    T1 _b; 
}; 

+0

मुझे नहीं लगता था कि यह जरूरी था, मैं सिर्फ सिंटैक्स गलतियों को कर रहा था, मुझे लगता है क्योंकि मुझे संकलन करने के लिए प्रोग्राम नहीं मिल सका। मैं आपके नमूना कोड से ठीक करने में सक्षम था। धन्यवाद! –

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