Didaktik amaçlar için kendi bağlı liste sınıfımı uygulamaya çalışıyorum.Şablon sınıfında şablon sınıfını bildirirken derleyici hatası
"Liste" sınıfını Yineleyici bildirimi içinde arkadaş olarak belirledim, ancak derleme görünmüyor.
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>;
};
Liste
Bunlar
ben kullandım 3 sınıfların arabirimleri vardır. h#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&);
};
Ve bu çalıştırmak çalışıyorum test programı: Ben onu derlemeye çalıştığınızda
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;
}
, derleyici bana aşağıdaki hataları veriyor :
Iterator.h: 26: hata: 'Liste' bir şablon
değilIterator.h:
trial.cpp:: 18:
Iterator.h buradan örneği: 12: Hata: için gerekli şablon argümanı 'struct Listesi 'Yineleyiciyi' nesnelleştirilmesi olarak '
List.cc: üye işlevi 'Yineleyici listesi :: createStartIterator() Sabit [T = int]':
trial.cpp: 18:
Iterator.h buradan örneği: 14: hatası: 'Yineleyici :: Yineleyici (Düğüm *) [T = int] özeldir
listesi .cc: 120: hata: bu bağlamda Arkadaş bildirimini kabul etmiyor gibi görünüyor. Nerede yanlış yaptım?
Kendi null (veya NULL veya ilgili herhangi bir şey) makrosunu tanımlamayın. Veri üyelerini başlatma durumunda, '0' iyi çalışıyor. –
Çirkin olduğunu biliyorum, sadece geçiciydi. Fakat C++ 'nın örtülü dökümlere izin vermediğinden eminim. –
Yayınlar asla örtük değildir, ancak dönüşümler vardır. (Aynı madalyonun iki yüzü de diyebilirsiniz, ve "dönüşüm" de diğer kullanımlar arasında bir değeri dönüştüren yöntemleri adlandırmak için kullanılır, ancak bu farklı bir dönüşüm türüdür.) Bir işaretçiyi başlatmak için ihtiyacınız olan şey başka bir göstericidir uygun tip veya boş bir işaretçi sabiti; '0' gayet iyi bir null pointer sabitidir (' 'NULL' da isterseniz, ''). –