私はCRTPを使用してリンクリストを作成することになっています。それぞれのヘッダーファイルでクラスを定義する方法について、いくつかの開始コード/提案があります。私はいくつかのコード以下省略している:1つのヘッダーに複数のクラスを宣言するC++
Link.h
#include <iosfwd>
template<class T>
class List;
template<class T>
class Link {
Link* next;
friend class List<T>;
public:
Link();
virtual ~Link() = default;
//etc...
List.h
#include "Link.h"
template<class T>
class List : public Link<T> {
public:
List();
T* First();
T* Last();
//Etc...
このコードはコンパイルをエラーなし。今私の質問は、Link.hの2つの最初の行、template<class T> class List;
です。私は少し実験して、Link.hがfriend class List<T>
ステートメントのそのクラス定義がなければコンパイルしないことに気付きました。しかし、なぜ私は#include "List.h"
と書いてList.h内の継承を削除して、その定義を最初から使用することはできませんか?
#include "Link.h"
template<class T>
class List {
public:
List();
T* First();
循環依存性が原因です。彼らはお互いを含んでいます。 –
ここにはCRTPはなく、通常の継承だけです。 – molbdnilo
なぜあなたは#include "List.h"がテンプレートのほうが好ましいと思いますか class List;あなたがそれをすることができたとしても? includeは、listの定義全体(およびファイルの他の内容)を導入します。前方宣言では "これはテンプレート/クラスの名前です"と書かれているので、それを友人に宣言するとコンパイラにエラーのようには見えません。 –
ROX