2010-01-03 13 views
12

के भीतर टेम्पलेट मित्र वर्ग घोषित करने में संकलक त्रुटि मैं व्यावहारिक उद्देश्यों के लिए अपनी खुद की लिंक्ड सूची कक्षा को लागू करने की कोशिश कर रहा हूं।एक टेम्पलेट वर्ग

मैंने "सूची" वर्ग को इटरेटर घोषणा के अंदर मित्र के रूप में निर्दिष्ट किया है, लेकिन यह संकलन प्रतीत नहीं होता है।

Node.h:

#define null (Node<T> *) 0 

template <class T> 
class Node { 
public: 
    T content; 
    Node<T>* next; 
    Node<T>* prev; 

    Node (const T& _content) : 
     content(_content), 
     next(null), 
     prev(null) 
    {} 
}; 

Iterator.h:

#include "Node.h" 

template <class T> 
class Iterator { 
private: 
    Node<T>* current; 

    Iterator (Node<T> *); 

public: 
    bool isDone() const; 

    bool hasNext() const; 
    bool hasPrevious() const; 
    void stepForward(); 
    void stepBackwards(); 

    T& currentElement() const; 

    friend class List<T>; 
}; 

सूची

ये 3 वर्गों के इंटरफेस मैं का उपयोग किया है रहे हैं। एच

#include <stdexcept> 
#include "Iterator.h" 

template <class T> 
class List { 
private: 
    Node<T>* head; 
    Node<T>* tail; 
    unsigned int items; 

public: 
    List(); 

    List (const List<T>&); 
    List& operator = (const List<T>&); 

    ~List(); 

    bool isEmpty() const { 
     return items == 0; 
    } 
    unsigned int length() const { 
     return items; 
    } 
    void clear(); 

    void add (const T&); 
    T remove (const T&) throw (std::length_error&, std::invalid_argument&); 

    Iterator<T> createStartIterator() const throw (std::length_error&); 
    Iterator<T> createEndIterator() const throw (std::length_error&); 
}; 

और यह परीक्षण कार्यक्रम मैं भागने की कोशिश कर रहा है है: जब मैं यह संकलन करने की कोशिश

trial.cpp

using namespace std; 
#include <iostream> 
#include "List/List.cc" 

int main() 
{ 
List<int> myList; 

for (int i = 1; i <= 10; i++) { 
    myList.add(i); 
} 

for (Iterator<int> it = myList.createStartIterator(); !it.isDone(); it.stepForward()) { 
    cout << it.currentElement() << endl; 
} 

return 0; 
} 

, संकलक मुझे निम्न त्रुटियों देता है :

Iterator.h: 26: त्रुटि: 'सूची' एक टेम्पलेट

नहीं है

Iterator.h:

trial.cpp:: 18: यहां से

Iterator.h instantiated: 12: त्रुटि: टेम्पलेट तर्क के लिए आवश्यक 'struct सूची' इटरेटर 'की इन्स्टेन्शियशन में '

List.cc: सदस्य समारोह में' इटरेटर सूची :: createStartIterator() स्थिरांक [साथ टी = int] ':

trial.cpp: 18: यहां से

Iterator.h instantiated: 14: त्रुटि: 'इटरेटर :: इटरेटर (नोड *) [के साथ टी = int]' निजी है

सूची .cc: 120: त्रुटि: इस संदर्भ में

ऐसा लगता है कि यह मित्र घोषणा को पहचान नहीं रहा है। मैं गलत कहां गया?

+0

अपने स्वयं के शून्य (या न्यूल, या कुछ भी संबंधित) मैक्रो परिभाषित न करें। डेटा सदस्यों को शुरू करने के मामले में, '0' ठीक काम करता है। –

+0

मुझे पता है कि यह बदसूरत है, यह केवल अस्थायी था। लेकिन मुझे पूरा यकीन था कि सी ++ ने निहित कास्टिंग की अनुमति नहीं दी थी। –

+0

जानवर कभी अंतर्निहित नहीं होते हैं, लेकिन रूपांतरण होते हैं। (एक ही सिक्का के दो पक्ष, आप कह सकते हैं, और "रूपांतरण" का उपयोग विधियों को नाम देने के लिए भी किया जाता है जो अन्य उपयोगों के बीच एक मूल्य को परिवर्तित करते हैं, लेकिन यह एक अलग प्रकार का रूपांतरण है।) आपको पॉइंटर को प्रारंभ करने के लिए क्या चाहिए, एक और सूचक है उपयुक्त प्रकार, या एक शून्य सूचक स्थिर; '0' एक पूरी तरह से ठीक नल सूचक स्थिर है (यदि आप पसंद करते हैं तो 'न्यूल' भी है)। –

उत्तर

15

कोशिश Iterator.h के शुरू में एक आगे घोषणा

template <class T> class List; 

जोड़ने - हो सकता है कि क्या आप Iterator वर्ग के अंदर friend घोषणा काम करने की अनुमति की जरूरत है।

+0

धन्यवाद! यह मेरे लिए काम किया। – sgowd

5

समस्या यह है कि सूची Iterator.h में ठीक से घोषित नहीं की गई है। इसके बजाय, सूची के अंदर इटरेटर क्लास घोंसला (स्वचालित रूप से इसे एक टेम्पलेट बनाते हुए), जिसे आप संभवतया करना चाहते हैं (सूची :: इटरेटर का उपयोग सूची इटरेटर या इटरेटरफोरलिस्ट में करने के बजाय, जैसा कि आप एक से अधिक इटरेटर चाहते हैं एक नामस्थान में)।

template<class T> 
struct List { 
    //... 
    struct Node {/*...*/}; 
    struct Iterator { 
    // ... 
    private: 
    Iterator(Node*); 
    friend class List; // still required 
    }; 
    //... 
}; 
संबंधित मुद्दे