當我試圖製作我的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*
,則表示它正常工作。
那麼,如果你做到了這一點,謝謝。對於糟糕的英語感到抱歉。
您在'Header1.h'中包含'Header1.h'並在'Header2.h'中包含'Header2.h'。這可能會讓你的守衛感到困惑。你應該先解決。 – juanchopanza 2015-01-20 19:37:36
當你使用struct2(struct struct1 * par1)時會發生什麼;而不是struct2(struct1 * par1);? – 2015-01-20 19:38:39
@juanchopanza感謝您的評論。不,沒關係,因爲沒有包含Header1.h包含Header2.h,其中包含Header1.h。所以他們無論如何都包括在內。這就是我使用包括警衛的原因。評論這些行不起作用。 – LHLaurini 2015-01-20 19:41:29