这里有循环依赖吗?

时间:2013-02-15 17:41:51

标签: c++ class vector g++

下面我复制了部分代码的简化版本,在编译时会出错。

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)。我无法看到我的代码和代码之间的相似性。我做错了什么。

2 个答案:

答案 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