के भीतर टेम्पलेट मित्र वर्ग घोषित करने में संकलक त्रुटि मैं व्यावहारिक उद्देश्यों के लिए अपनी खुद की लिंक्ड सूची कक्षा को लागू करने की कोशिश कर रहा हूं।एक टेम्पलेट वर्ग
मैंने "सूची" वर्ग को इटरेटर घोषणा के अंदर मित्र के रूप में निर्दिष्ट किया है, लेकिन यह संकलन प्रतीत नहीं होता है।
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' एक पूरी तरह से ठीक नल सूचक स्थिर है (यदि आप पसंद करते हैं तो 'न्यूल' भी है)। –