1

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

测试.cpp

#include <iostream>
#include "../Beta.h"
#include "../Alpha.h"

using namespace std;

int main() {
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}

阿尔法.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我收到以下错误消息

在 testing.cpp:10:0: ../Beta.h:8:15: 错误中包含的文件中:

嵌套名称说明符中使用的不完整类型“Alpha”../Beta.h:8:15:

错误:嵌套名称说明符中使用的类型“Alpha”不完整

../Beta.h:8:27: 错误:模板参数 1 无效 ../Beta.h:8:27:

错误:模板参数 2 无效

我可以从论坛线程中看到,第一个错误是由于某种循环依赖(错误:嵌套名称说明符中使用的类型不完整)。我看不到我的代码和他们的代码之间的相似性。我究竟做错了什么。

4

2 回答 2

5

这并不是真正的循环依赖。 Beta.h只需要 to#include "Alpha.h"而不是前向声明class Alpha;.

于 2013-02-15T17:44:54.313 回答
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
于 2013-02-15T17:45:11.310 回答