2017-11-14 10 views
0

私は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(); 
+3

循環依存性が原因です。彼らはお互いを含んでいます。 –

+0

ここにはCRTPはなく、通常の継承だけです。 – molbdnilo

+0

なぜあなたは#include "List.h"がテンプレートのほうが好ましいと思いますか class List;あなたがそれをすることができたとしても? includeは、listの定義全体(およびファイルの他の内容)を導入します。前方宣言では "これはテンプレート/クラスの名前です"と書かれているので、それを友人に宣言するとコンパイラにエラーのようには見えません。 – ROX

答えて

0
List.hを

Link.h

#include <iosfwd> 
#include "List.h" 


template<class T> 
class Link { 
    Link* next; 

    friend class List<T>; 

public: 
    Link(); 

    virtual ~Link() = default; 

を:私は、もちろん、これを試してみましたエラー

"error: 'List' is not a class template 
    friend class List<T>;" 

それは次のようになりますを取得しています

一意のテンプレートを使用するようにしてください1つのファイル内のみで、または互いに順番に構築されたファイル内で、同じではありません。あなたの場合は、おそらくすべてのファイルを1つに移動する必要があります。あなたの.hファイルはお互いを鏡映しているように見えるので、あなたのコンパイラはあなたの参照の間を行き来するでしょう。優先順位を選択します。

関連する問題