2013-02-15 68 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