2010-01-03 31 views
12

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ğil

Iterator.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?

+0

Kendi null (veya NULL veya ilgili herhangi bir şey) makrosunu tanımlamayın. Veri üyelerini başlatma durumunda, '0' iyi çalışıyor. –

+0

Çirkin olduğunu biliyorum, sadece geçiciydi. Fakat C++ 'nın örtülü dökümlere izin vermediğinden eminim. –

+0

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, ''). –

cevap

15

deneyin - Eğer Iterator sınıf içinde friend beyan çalışmasını sağlamak için gerekenleri olabilir.

+0

Teşekkürler! Bu benim için çalıştı. – sgowd

5

Sorun, List'in Iterator.h dosyasında düzgün bir şekilde bildirilmemiştir. Bunun yerine, Listede Iterator sınıfını (otomatik olarak bir şablon haline getirin) yerleştirin; bu, muhtemelen birden fazla yineleyiciniz olmasını istediğiniz gibi, ListIterator veya IteratorForList olarak yeniden adlandırmak yerine, List :: Iterator'ı kullanmak isteyebilirsiniz. bir isim alanında).Iterator.h başında bir ileri deklarasyon

template <class T> class List; 

ekleyerek

template<class T> 
struct List { 
    //... 
    struct Node {/*...*/}; 
    struct Iterator { 
    // ... 
    private: 
    Iterator(Node*); 
    friend class List; // still required 
    }; 
    //... 
}; 
İlgili konular