2013-02-15 44 views
1

下面我重现了编译时出现错误的部分代码的简化版本。这里有循环依赖吗?

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

In file included from testing.cpp:10:0: ../Beta.h:8:15: error:

incomplete type ‘Alpha’ used in nested name specifier ../Beta.h:8:15:

error: incomplete type ‘Alpha’ used in nested name specifier

../Beta.h:8:27: error: template argument 1 is invalid ../Beta.h:8:27:

error: template argument 2 is invalid

我可以从论坛主题的第一个错误是因为某种循环依赖(Error: incomplete type used in nested name specifier)的见。我无法看到我的代码和他们的代码之间的相似性。我究竟做错了什么。

+0

这不是一个循环依赖。它只是意味着你不能引用'Alpha :: info *',因为它没有在任何地方声明过。 – us2012 2013-02-15 17:44:38

回答

3

您需要在Beta.h中包含Alpha.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 
+0

你能告诉我最初我的代码中出了什么问题吗?为什么我不明白我写'class Alpha'的时候?我在哪里可以了解更多关于这个特定问题我不知道这个技术术语。 – user13107 2013-02-15 18:03:57

+2

@ user13107一个前向声明只是说“有一个这样的名字有这个名字的阿尔法或者什么,我们对此一无所知”。当你在代码中说“Alpha :: info”之类的东西时,该代码需要访问“Alpha”类的完整定义。否则它无法知道'阿尔法::信息'。 – juanchopanza 2013-02-15 18:06:03

5

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

+0

但是然后Alpha.h将不得不前向声明'Beta',所以你可以使它成为'Alpha'的朋友,不是吗? – us2012 2013-02-15 17:45:39

+3

不,你可以声明一个以前从未声明过的“朋友”类。如果你想声明'class Beta;'可以使它更清楚一点,当然。 – aschepler 2013-02-15 17:46:51

+0

谢谢,但是当我用'#include Alpha.h'替换'class Alpha;'时,会给出一个不同的错误''在testing.cpp包含的文件中:11:0: ../Alpha.h:3:7:错误:重新定义'class Alpha' ../Alpha.h:3:7:错误:'class Alpha''的先前定义 – user13107 2013-02-15 17:52:06