问题是,如果通过模板模板化出一个类,那么将其包括在内以照常使用:它将得到下面解释的错误:
如果要求在Node.inl中直接使用structSomething;节点.h";标题如下,但这会带来一些麻烦。我们违反了一个定义的规则,但模板类需要在声明它们时将它们的定义包含在同一个文件中。否则,编译器将忘记在创建的实例上模板化成员函数。因此,我们无法通过初始化的实例使用这些函数。那么,当我们想保持声明和定义的独立性,坚持不违反一条定义规则时,我们该如何处理呢?
Node.inl:
#include "Node.h"
void foo(){
struct Something s{1, 2};
}
template <class T>
Node<T>::Node(int data, Node<T> *next) : m_data{data}, m_next{next} {}
template <class T>
void Node<T>::setData(int data) {
m_data = data;
}
template <class T>
int Node<T>::getData() const {
return m_data;
}
template <class T>
void Node<T>::setNext(Node<T> *next) {
m_next = next;
}
template <class T>
Node<T> * Node<T>::getNext() const {
return m_next;
}
template <class T>
void Node<T>::allocMemoryNext() {
m_next = new Node<T>();
}
节点.h:
#ifndef THE1_NODE_H
#define THE1_NODE_H
struct Something{
int x;
int y;
};
template <class T>
class Node {
private:
T m_data;
Node *m_next;
public:
explicit Node(int data = 0, Node *next = nullptr);
void setData(int data);
[[nodiscard]] int getData() const;
void setNext(Node *next);
[[nodiscard]] Node *getNext() const;
void allocMemoryNext();
};
#include "Node.inl"
#endif //THE1_NODE_H
我们希望保留声明和定义的分离性
没有这样的"分离性";就模板而言。为了让任何人都能使用它们,必须对它们进行定义。Node.h提供了这些定义。
Node.inl是Node.h的一部分。您已经从逻辑上将文本分离到不同的文件中,但就任何实际情况而言,它们并不分离。Node.h的每个用户都应该得到Node.inl的东西,这就是为什么在文件末尾使用#include "Node.inl"
的原因。除了Node.h之外,任何人都不应该包含Node.inl,所以Node.inl没有理由包含#include "Node.h"
。
因此,一旦你删除了对一个肯定已经存在的东西的不必要的包含,就没有问题了。