我得到了一个分配,我应该使用CRTP创建一个链接列表。我得到了一些关于如何在各自的头文件中定义类的开始代码/建议。我在下面省略了一些代码:
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中的继承并从一开始就使用该定义?我当然试过这个并得到错误
"error: 'List' is not a class template
friend class List<T>;"
它看起来像这样:
Link.h
#include <iosfwd>
#include "List.h"
template<class T>
class Link {
Link* next;
friend class List<T>;
public:
Link();
virtual ~Link() = default;
List.h
#include "Link.h"
template<class T>
class List {
public:
List();
T* First();
答案 0 :(得分:0)
尝试仅在一个文件中使用唯一模板,或者在按顺序相互构建的文件中使用唯一模板,而不是相同。在您的情况下,您应该将所有文件移动到一个。您的.h文件似乎彼此镜像,因此您的编译器会在您的引用之间来回转换,但它们按顺序执行。选择优先顺序。