2015-09-18 19 views
5

Sanırım bir arkadaş sınıfı olarak bildirmeye çalıştığım bir şablon sınıfım var. Sınıfı ilan etmeli mi yoksa kendi şablonunu mı vermeliyim? Her ikisi de burada çalışıyor gibi görünüyor, ancak bunu doğru bir şekilde yapmakla ilgileniyorum.Şablon Arkadaş Sınıfı: Forward Declaration or ...?

Örnek:

template <typename E> 
class SLinkedList; 
template <typename E> 
class SNode { 
private: 
    E elem; 
    SNode<E>* next; 
    friend class SLinkedList<E>; 
}; 

Ya

template <typename E> 
class SNode { 
private: 
    E elem; 
    SNode<E>* next; 
    template <typename T> 
    friend class SLinkedList; 
}; 

- Bu kod, bir veri yapıları ve algoritmalar ders kitabı dışında doğrudan ne değiştirilmiş ne onun değer için

. Ancak, kitabın " 'SLinkedList'

template <typename E> 
class SNode { 
private: 
    E elem; 
    SNode<E>* next; 
    friend class SLinkedList<E>; 
}; 

Dolayısıyla bu soruya C. Yeni ++ şablon olmayan sınıfın Açık ihtisas Xcode hata veriyor aşağıdaki kodu kullanır.

cevap

9

İlk yaklaşım muhtemelen ne olduğunu istediğiniz. O tüm eşleşen türleri için SLinkedList<int>SNode<int> bir arkadaşı ve benzeri yapacaktır.

Kişisel ikinci yaklaşım her SLinkedList her SNode arkadaş yapacaktır. Bu SLinkedList<Widget> dokunmadan işi yok olarak ne istediğinizi muhtemelen değil privat Bir SNode<int>


e parçaları Tavsiye verebilecek farklı bir yaklaşım SNode yuvalanmış bir sınıf yapmak olacaktır. Bütün sınıf SLinkedList

özel olacağından, siz de arkadaş beyanı kurtulmak ve SNode her şeyi herkese açık olabilir

template <typename E> 
class SLinkedList { 
    struct SNode { 
     E elem; 
     SNode* next; 
    }; 
}; 

Bu şema ile: Bu düğümden oluşan veri yapıları için oldukça yaygındır

+0

İlginç bir öneri. Şerefe – badfilms

İlgili konular