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();
순환 종속성 때문에. 그들은 둘 다 서로를 포함합니다. –
여기에는 CRTP가 없으며 정기적 인 상속 만 있습니다. – molbdnilo
왜 #include "List.h"가 템플릿 class List보다 바람직하다고 생각하십니까? 네가 할 수 있다고해도? include는 list의 전체 정의 (및 파일의 다른 내용)를 소개합니다. forward 선언문은 "this is a template/class"라고 말합니다. 따라서 friend라고 선언하면 컴파일러에 에러가되지 않습니다. –
ROX