嗨......
#ifndef Node_H
#define Node_H
#include <vector>
#include <stack>
#include <string>
#include <iostream>
#include "Edge.h"
#include "CongestionMap.h"
using namespace std;
class Node
{
public:
Node(){ visit = false;};
Node(int id);
~Node();
int getID();
void setLocation(int &row, int &col, GridCell *Gc);;
void displayList();
private:
int row;
int col;
int id;
bool visit;
int parrent;
int distance;
typedef vector< Edge > adjNodeList;
};
#endif
当我编译项目时,我得到错误 project \ node.h(43):错误C2065:'Edge':未声明的标识符 project \ project \ node.h(43):错误C2923:'std :: vector':'Edge'不是参数'_Ty'的有效模板类型参数... 请帮我 ... Edge.h
#ifndef Edge_H
#define Edge_H
#pragma once
#include <vector>
#include <stack>
#include <string>
#include <iostream>
#include "Node.h"
using namespace std;
class Edge
{
public:
Edge() {};
Edge(Node *firstNode, Node *secNode, int inCost);
~Edge(void);
Node* getDstNode();
Node* getOrgNode();
int getCost();
private:
Node *orgNode;
Node *dstNode;
int cost;
};
#endif
答案 0 :(得分:7)
正如一些评论者所指出的那样,你有循环引用。代码按其出现的顺序进行解析。
如果我们从早期开始node.h
,则其中包含edge.h
。
edge.h
包括node.h
,但由于#ifdef
保护,以及冗余的#pragma once
(他们都实现了同样的目标),因此巧妙地无法做任何事情,所以你可能会考虑只坚持一种方法。)
好的,我们遇到的第一个类定义是Edge
。太棒了,除了引用Node
之外,没有人知道那是什么......因为我们仍然在edge.h
的代码中已被包含在node.h
中}。
可能你反而发生了事情,edge.h
首先被包括在内。接下来发生的事情是包含node.h
,并声明Node
,它希望知道Edge
是什么,但是还没有人看到过。
因此,在宣布edge.h
之前,您需要使用class Edge
,Node
,添加一行说明class Node;
:
node.h
相反,在Edge
中,为node.h
提供前瞻性声明。第二个是涵盖某人在edge.h
之前包含class Node; // forward declaration so that compiler knows that
// Node is a class when it gets to parsing Edge
class Edge {
...
private:
Node *orgNode;
};
class Node {
....
};
}
的情况。
例如,如果你在同一个文件中声明它们,你仍然需要做类似的事情:
dat1 <- data.frame(x=c('A','A','B','B'), y=c('A','B','C','D'), val = 1:4)
dat2 <- data.frame(val = 1:4)
dat_group <- data.frame(x=c('A','A','B','B'))
# invalid subscript type 'integer'
dat1 %>%
group_by(dat1$x) %>%
mutate(y = sum(unique(y) %in% c("A","B","C")))
# invalid subscript type 'list'
dat2 %>%
group_by(dat_group$x) %>%
mutate(y = sum(unique(y) %in% c("A","B","C")))