我做了类似的事情:
struct Vertex {
list<Edge*> edges;
};
struct Edge {
Vertex* v1;
Vertex* v2;
};
和编译器错误:
'Edge'未在此范围内声明
如何在不将这两个标题放入单独的标题“vertex.h”和“edge.h”的情况下解决这个问题?
答案 0 :(得分:5)
在使用Edge
之前使用转发声明。
struct Edge;
struct Vertex
{
list<Edge*> edges;
};
请注意,当您转发声明类型时,编译器将该类型视为不完整类型,它不知道该类型的布局,但它只知道该类型存在,因此对于如何使用不完整类型存在一些限制。
答案 1 :(得分:1)
您可以转发声明类型:
struct Vertex;
struct Edge {
Vertex* v1;
Vertex* v2;
};
话虽这么说,让顶点知道它的边缘列表可能不是图形的好设计;如果你想在多个图中重用相同的顶点怎么办? (例如,机场可能是不同人使用的多个不同行程中的合理顶点。)
答案 2 :(得分:1)
如果你的类型通过指针互相使用,你可以在定义另一个之前转发声明其中一个。例如:
struct Vertex;
struct Edge { Vertex* v1; Vertex* v2; };
struct Vertex { list<Edge*> edges; };