我有一个类Node和一个struct Edge。 但是当结构在类之前编写时,结构会抱怨不知道什么是距离。 对于这种方式来说也是一样的,当结构被定义之后,classe抱怨不知道什么是Edge(向量的类型)。
//This is my header file
typedef struct Edge Edge;
struct Edge{
Node node;
int distance;
};
class Node
{
private:
std::vector<Edge> vectorOfEdges;
};
如何解决此错误? 谢谢。
答案 0 :(得分:2)
如果你真的希望保持代码原样,就没有办法解决这个问题:就标准而言,std::vector<T>
字面上可能包含T
类型的元素,因此你有一个循环的相互依赖,Edge
包含Node
而Node
包含Edge
,这是没有意义的。
(实际的措辞是在不完整类型上实例化标准库容器模板是未定义的行为。)
典型的解决方法是PIMPL习惯用法,你只需要为元素提供指针:
struct Edge;
class Node
{
std::unique_ptr<std::vector<Edge>> pVecImpl;
public:
Node() : pVecImpl(::new std::vector<Edge>) { }
// ...
};
struct Edge
{
// as before
};
Herb Sutter的GotW #101描述了一种巧妙的解决方案,以干净和有吸引力的方式抽象出这种模式。
(或者你也可以将Edge::node
变成指针。)
答案 1 :(得分:1)
您的定义是循环的:它会尝试将Node
放在Edge
内,并在Node
内放置一个边矢量。你需要将其中一个作为指针,例如,像这样:
class Node;
struct Edge{
Node *node;
int distance;
};
class Node {
private:
std::vector<Edge> vectorOfEdges;
};
P.S。你在结构之后错过了一个分号。