C ++在一个头文件中声明多个类

时间:2017-11-14 11:04:03

标签: c++ templates header

我得到了一个分配,我应该使用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();

1 个答案:

答案 0 :(得分:0)

尝试仅在一个文件中使用唯一模板,或者在按顺序相互构建的文件中使用唯一模板,而不是相同。在您的情况下,您应该将所有文件移动到一个。您的.h文件似乎彼此镜像,因此您的编译器会在您的引用之间来回转换,但它们按顺序执行。选择优先顺序。