下面我复制了部分代码的简化版本,在编译时会出错。
testing.cpp
#include <iostream>
#include "../Beta.h"
#include "../Alpha.h"
using namespace std;
int main() {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
return 0;
}
Alpha.h
#include <vector>
class Alpha
{
public:
typedef struct _info{
int k;
} info;
friend class Beta;
};
Beta.h
#include <vector>
class Alpha;
class Beta
{
public:
std::vector <Alpha::info*> vecInfo;
};
当我运行g++ testing.cpp
时,我收到以下错误消息
在tests.cpp中包含的文件中:10:0:../Beta.h:8:15:错误:
在嵌套名称说明符中使用的不完整类型'Alpha'.. / Beta.h:8:15:
错误:嵌套名称说明符
中使用的不完整类型'Alpha'../ Beta.h:8:27:错误:模板参数1无效../ Beta.h:8:27:
错误:模板参数2无效
我可以从论坛帖子看到第一个错误是由于某种循环依赖(Error: incomplete type used in nested name specifier)。我无法看到我的代码和代码之间的相似性。我做错了什么。
答案 0 :(得分:5)
这实际上不是循环依赖。 Beta.h
只需要#include "Alpha.h"
而非前向声明class Alpha;
。
答案 1 :(得分:3)
您需要在Alpha.h
中加入Beta.h
,因为需要完整的类定义才能访问Alpha::info
。这不会创建循环依赖,因为Alpha.h
不包含Beta.h
。
// don't forget the include guards!
#ifndef BETA_H_
#define BETA_H_
#include <vector>
#include "../Alpha.h"
class Beta
{
public:
std::vector <Alpha::info*> vecInfo;
};
#endif