2015-09-18 11 views
5

友達クラスとして宣言しようとしているテンプレートクラスがあるとします。クラスを宣言するか、独自のテンプレートを渡す必要がありますか?両方ともここで動作するようですが、これを正しく行う方法に興味があります。テンプレートフレンドクラス:フォワード宣言または...?

例:

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

それとも

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

-

何の価値については、このコードは、データ構造とアルゴリズムの教科書から直接あるものから変更されます。しかし、この本は「『SLinkedList』

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

したがって、この質問Cへ。新++非テンプレートクラスの明示的な特殊化をXcodeでエラーが発生します、次のコードを使用しています。

答えて

9

あなたの最初のアプローチは、おそらく何ですあなたがしたい。それは、一致するすべてのタイプのSLinkedList<int>SNode<int>の友人、および類似を行います。

はあなたの第二のアプローチは、すべてのSLinkedListすべてのSNodeの友人になります。これは、SLinkedList<Widget>は触れて何のビジネスを持っていないとして、あなたが望むもの、おそらくではありませんプライベートSNode<int>


の電子部品は、私はお勧めでき異なったアプローチがSNode入れ子になったクラスを作ることであろう。クラス全体がSLinkedList

にプライベートになるので、あなたにもフレンド宣言を取り除くと SNodeですべてがパブリックで持っているかもしれ

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

をこの方式では:これは、ノードからなるデータ構造にかなり一般的です

+0

興味深い提案。乾杯 – badfilms

関連する問題