【发布时间】:2012-10-24 18:38:21
【问题描述】:
我已经创建了一个 A 类和一个 B 类,我试图在 A 中设置一个 B 类型的向量,在 B 中设置一个 A 类型的向量:
A 类标头:
#ifndef A_H_
#define A_H_
#include "B.h"
#include <vector>
using namespace std;
class A {
public:
vector<B> bvector; // here is the error
A();
};
#endif /* A_H_ */
B 类标头:
#ifndef B_H_
#define B_H_
#include "A.h"
#include <vector>
using namespace std;
class B {
vector<A> aVector; //Here is the error
public:
B();
};
#endif /* B_H_ */
但我收到以下错误:
"..\src/B.h:16:8: 错误:'A' 未在此范围内声明
..\src/B.h:16:9: 错误:模板参数 1 无效
..\src/B.h:16:9: 错误:模板参数 2 无效"
如果我删除 B 中的坏行,哪个会翻转到 A.h。我做错了什么?
【问题讨论】:
-
您必须对其中一个进行前向声明(但由于您可以为两者都这样做,因此您应该在两者中都这样做,而不是
#include任何一个标题)。 -
@SethCarnegie 前向声明仅适用于指针:stackoverflow.com/questions/37346/…
-
@num3ric 它适用于不完整类型就足够的任何地方,包括
vector的声明。 -
@SethCarnegie,你说得对,它适用于任何不完整类型就足够的地方,但
std::vector需要完整类型。实例化具有不完整类型的大多数标准库模板是未定义的行为,请参阅 [res.on.functions]/2 -
@JonathanWakely 好烂。