2017-11-14 1 views
0

CRTP를 사용하여 링크 된 목록을 생성해야하는 작업이 있습니다. 각각의 헤더 파일에 클래스를 정의하는 방법에 대한 시작 코드/제안이 있습니다. 나는 몇 가지 코드 이하 생략 한 :하나의 헤더에 여러 클래스를 선언하는 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에있는 두 개의 첫 번째 줄, 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의 전체 정의 (및 파일의 다른 내용)를 소개합니다. forward 선언문은 "this is a template/class"라고 말합니다. 따라서 friend라고 선언하면 컴파일러에 에러가되지 않습니다. – 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>;" 

는 다음과 같이 것을 얻을 수있다

고유 한 템플릿을 사용해보세요. 하나의 파일에만 또는 서로 순차적으로 구축되는 파일에 동일하게 적용되지 않습니다. 귀하의 경우 모든 파일을 하나씩 이동해야합니다. .h 파일은 서로를 미러링하는 것처럼 보이므로 컴파일러는 참조 사이를왔다 갔다하지만 순서대로 정렬합니다. 우선 순위를 선택하십시오.

관련 문제