node.hppに応じ
#ifndef LINKED_IMPLEMENTATION_TPP
#define LINKED_IMPLEMENTATION_TPP
template <typename T>
class node {
...
friend class linked<T>;
};
template <typename T>
class linked {
...
};
#endif
編集
#pragma once
template <typename T> class linked;
template <typename T> class node {
...
friend class linked<T>;
};
linked.hpp
#pragma once
#include "node.hpp" // just because I guess you will use it in linked implementation
template <typename T> class linked {
...
};
ですから含まlinked.hppなしで使用ノードを維持することができます。あなたはそれを秘密のヘッダーにしておくこともでき、ユーザーには出荷されません。しかし、リンクされている場合、リンクされたクラスを使用したいコードはlinked.hppをインクルードするだけです。
EDITオプション node.hppとして
#pragma once
template <typename T> class node {
...
class linked;
friend class linked<T>;
};
linked.hpp
#pragma once
#include "node.hpp"
template <typename T> class node<T>::linked {
...
};
これらのテンプレートクラスの.cppファイルを作成するにはポイントがありません。 [必要なインスタンス化を明示的にインスタンス化しない限り、ヘッダーに実装する*必須* *](https://stackoverflow.com/q/495021/501250)それらをインスタンス化するためにテンプレートクラスメンバーの定義を知る必要があります。 – cdhowie
私があなただったら、 'node'を構造体として宣言し、そのメンバーをすべてpublicにします。あなたは本当に便利なオブジェクトなので、実際にはアクセス制御は必要ありません。 – NathanOliver
@cdhowie私は別のコードを持っていますが、これは単純化されたバージョンです。そこにはそれぞれのクラスごとに異なるcppファイルを作成する必要があります。前方宣言またはそれに似たものを実装する方法 –