6

フレンド クラスとして宣言しようとしているテンプレート クラスがあるとします。クラスを前方宣言するか、独自のテンプレートを指定する必要がありますか?

例:

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;
};
4

1 に答える 1

10

あなたの最初のアプローチはおそらくあなたが望むものです。SLinkedList<int>のフレンドになりSNode<int>、一致するすべてのタイプに類似します。

あなたの2番目のアプローチは、すべてをすべてSLinkedListの友達にしますSNode。これはおそらくあなたが望むものでSLinkedList<Widget>はありません。SNode<int>


私がお勧めできる別のアプローチはSNode、ネストされたクラスを作成することです。これは、ノードで構成されるデータ構造では非常に一般的です。

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

このスキームでは、SNodeクラス全体がプライベートになるため、フレンド宣言を取り除き、すべてをパブリックにすることもできます。SLinkedList

于 2015-09-18T23:13:00.480 に答える