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