2015-01-20 183 views
0

當我試圖製作我的DX11引擎時,我遇到了一個非常奇怪的問題。我沒發現什麼是錯的。所以,我決定做一些簡單的代碼並嘗試獲得相同的錯誤。這:一個非常奇怪的C++行爲

Source.cpp

#include <iostream> 
#include "Header.h" 

using namespace std; 

struct1 g_struct1(12); 
struct2 g_struct2(&g_struct1); 

int main() 
{ 
    cout << "Value of g_struct1.num: " << g_struct1.num << endl; 
    cout << "Value of g_struct2.copynum: " << g_struct2.copynum << endl; 
    getchar(); 
    return 0; 
} 

Header.h

#ifndef _HEADER_H_ 
#define _HEADER_H_ 

#include "Header1.h" 
#include "Header2.h" 

#endif 

Source1.cpp

#include "Header1.h" 

struct1::struct1(int number) 
{ 
    num = number; 
}; 

那麼header1.h

#ifndef _HEADER1_H_ 
#define _HEADER1_H_ 

#include "Header1.h" 
#include "Header2.h" 

struct struct1 
{ 
    struct1(int number); 
    int num; 
}; 

#endif 

Source2.cpp

#include "Header2.h" 

struct2::struct2(struct1 *par1) 
{ 
    copynum = par1->num; 
}; 

Header2.h

#ifndef _HEADER2_H_ 
#define _HEADER2_H_ 

#include "Header1.h" 
#include "Header2.h" 

struct struct2 
{ 
    struct2(struct1 *par1); 
    int copynum; 
}; 

#endif 

錯誤

1>------ Build started: Project: ConsoleApplication1, Configuration: Debug Win32 ------ 
1> Source.cpp 
1>c:\users\<My Username>\desktop\consoleapplication1\consoleapplication1\header2.h(10): error C2061: syntax error : identifier 'struct1' 
1>c:\users\<My Username>\desktop\consoleapplication1\consoleapplication1\source.cpp(8): error C2664: 'struct2::struct2(const struct2 &)' : cannot convert argument 1 from 'struct1 *' to 'const struct2 &' 
1>   Reason: cannot convert from 'struct1 *' to 'const struct2' 
1>   No constructor could take the source type, or constructor overload resolution was ambiguous 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

當然,第二個錯誤並不重要,因爲編譯器認爲這是一個拷貝構造函數。

如果我將struct2::struct2(struct1 *par1)更改爲struct2::struct2(void *par1),然後將void *par1更改爲struct1*,則表示它正常工作。

那麼,如果你做到了這一點,謝謝。對於糟糕的英語感到抱歉。

+0

您在'Header1.h'中包含'Header1.h'並在'Header2.h'中包含'Header2.h'。這可能會讓你的守衛感到困惑。你應該先解決。 – juanchopanza 2015-01-20 19:37:36

+1

當你使用struct2(struct struct1 * par1)時會發生什麼;而不是struct2(struct1 * par1);? – 2015-01-20 19:38:39

+0

@juanchopanza感謝您的評論。不,沒關係,因爲沒有包含Header1.h包含Header2.h,其中包含Header1.h。所以他們無論如何都包括在內。這就是我使用包括警衛的原因。評論這些行不起作用。 – LHLaurini 2015-01-20 19:41:29

回答

3

您的標題具有循環依賴關係。他們甚至包括愚蠢的自己。最終結果是兩個頭都得不到正確處理。

Header1刪除#include兩行。在Header2刪除#include "Header2.h"。這應該解決這個問題。

+0

現在我明白了。 'Header1.h'不需要'Header2.h'。謝謝。 – LHLaurini 2015-01-20 20:03:02

-3

它不起作用,因爲在定義struct2期間struct1沒有被定義,並且你在構造中使用了未定義的struct poniter。

簡單的解決將是

struct struct2 
{ 
    struct2(struct struct1 *par1); // note the struct struct1 * 
    int copynum; 
}; 

你也不必依賴於在那麼header1.h Header2.h(但你在做Source2.cpp)如果你不使用它。

+0

如果包含Header1.h,爲什麼不定義'struct1'?因爲包含混亂了。 – juanchopanza 2015-01-20 19:53:17

+0

你說得對。我現在注意到了。 – LHLaurini 2015-01-20 19:54:34

+0

@juanchopanza我同意你的看法,但是Header1依賴於Header2,而Header2依賴於Header1。用戶可以做什麼? – 2015-01-20 19:55:25