Headers 守卫仍然产生重定义错误
Headers guards still yield redefinition errors
我正在编写一些模板化数据结构供将来使用,并且有一个 class Node
出现在我的单链表和图形实现中。这些 header 中的每一个都有 header 守卫,但我仍然收到重新定义错误:
In file included from driver.cc:4:
./Graph.h:7:7: error: redefinition of 'Node'
class Node {
^
./SinglyLinkedList.h:5:7: note: previous definition is here
class Node {
^
1 error generated.
SinglyLinkedList.h
#ifndef SINGLY_LINKEDLIST_H
#define SINGLY_LINKEDLIST_H
template <class T>
class Node {
public:
Node<T>() {}
Node<T>(T init) { data = init; }
void setData(T newData) { data = newData; }
void setNext(Node<T> *nextNode) { next = nextNode; }
const T getData() { return data; }
const Node<T> *getNext() { return next; }
private:
T data;
Node<T> *next;
};
template <class T>
class SLL {
public:
SLL<T>() { head = NULL; }
private:
Node<T> *head;
};
#endif
Graph.h
#ifndef GRAPH_H
#define GRAPH_H
#include <vector>
template <class T>
class Node {
public:
Node<T>() {};
Node<T>(T init) { data = init; }
private:
T data;
};
template <class T>
class Edge {
public:
Edge<T>(Node<T> a, Node<T> b);
private:
Node<T> to;
Node<T> from;
};
template <class T>
class Graph {
public:
Graph<T>(bool direction) { directed = direction; }
const bool getDirection() { return directed; }
private:
std::vector<Edge<T> > adjList;
bool directed;
};
#endif
driver.cc
#include <iostream>
#include <string>
#include "SinglyLinkedList.h"
#include "Graph.h"
int main()
{
Graph<int> Hello(false);
return 0;
}
我知道 class 并不完整,我知道没有必要重新发明轮子,因为我需要的一切都存在于 std
中,但有人可以解释为什么要重新定义class 节点错误?
我的假设是编译器看不到 SINGLY_LINKEDLIST_H
的定义,因此它会为其 class 中的所有内容创建一个定义;然后它再次看不到 GRAPH_H
并尝试为 Graph
class 中的所有内容创建一个定义,这会产生错误。
如果是这样,我该如何进行?单独创建一个Node
class?制作一个 Node
header ,其中包含两种数据结构可能需要的东西?
只是在寻找提示。
谢谢,
埃里普
您需要:
- 将
Node
class 分解到单独的头文件中。
- 或重命名
Node
class 以区分。
- 将
Node
classes 放入单独的命名空间。
如您的问题所示,两个头文件都包含 Node
class 的定义,您混淆了编译器。
我正在编写一些模板化数据结构供将来使用,并且有一个 class Node
出现在我的单链表和图形实现中。这些 header 中的每一个都有 header 守卫,但我仍然收到重新定义错误:
In file included from driver.cc:4:
./Graph.h:7:7: error: redefinition of 'Node'
class Node {
^
./SinglyLinkedList.h:5:7: note: previous definition is here
class Node {
^
1 error generated.
SinglyLinkedList.h
#ifndef SINGLY_LINKEDLIST_H
#define SINGLY_LINKEDLIST_H
template <class T>
class Node {
public:
Node<T>() {}
Node<T>(T init) { data = init; }
void setData(T newData) { data = newData; }
void setNext(Node<T> *nextNode) { next = nextNode; }
const T getData() { return data; }
const Node<T> *getNext() { return next; }
private:
T data;
Node<T> *next;
};
template <class T>
class SLL {
public:
SLL<T>() { head = NULL; }
private:
Node<T> *head;
};
#endif
Graph.h
#ifndef GRAPH_H
#define GRAPH_H
#include <vector>
template <class T>
class Node {
public:
Node<T>() {};
Node<T>(T init) { data = init; }
private:
T data;
};
template <class T>
class Edge {
public:
Edge<T>(Node<T> a, Node<T> b);
private:
Node<T> to;
Node<T> from;
};
template <class T>
class Graph {
public:
Graph<T>(bool direction) { directed = direction; }
const bool getDirection() { return directed; }
private:
std::vector<Edge<T> > adjList;
bool directed;
};
#endif
driver.cc
#include <iostream>
#include <string>
#include "SinglyLinkedList.h"
#include "Graph.h"
int main()
{
Graph<int> Hello(false);
return 0;
}
我知道 class 并不完整,我知道没有必要重新发明轮子,因为我需要的一切都存在于 std
中,但有人可以解释为什么要重新定义class 节点错误?
我的假设是编译器看不到 SINGLY_LINKEDLIST_H
的定义,因此它会为其 class 中的所有内容创建一个定义;然后它再次看不到 GRAPH_H
并尝试为 Graph
class 中的所有内容创建一个定义,这会产生错误。
如果是这样,我该如何进行?单独创建一个Node
class?制作一个 Node
header ,其中包含两种数据结构可能需要的东西?
只是在寻找提示。
谢谢, 埃里普
您需要:
- 将
Node
class 分解到单独的头文件中。 - 或重命名
Node
class 以区分。 - 将
Node
classes 放入单独的命名空间。
如您的问题所示,两个头文件都包含 Node
class 的定义,您混淆了编译器。