一个非常奇怪的 C++ 行为
A very strange C++ behavior
当我尝试制作我的 DX11 引擎时,我遇到了一个非常奇怪的问题。我找不到问题所在。所以,我决定编写一些更简单的代码并尝试得到相同的错误。这个:
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*
,它工作正常。
好吧,如果你做到了这一步,谢谢。抱歉英语不好。
它不起作用,因为在定义 struct2 期间未定义 struct1,并且您在构造中使用了未定义的 struct poniter。
只需修复即可
struct struct2
{
struct2(struct struct1 *par1); // note the struct struct1 *
int copynum;
};
此外,如果您确实使用它,则不必依赖 Header2.h 中的 Header1.h(但在 Source2.cpp 中需要依赖)。
你的 header 有循环依赖。他们甚至包括他们自己,这很愚蠢。最终结果是 header 都没有得到正确处理。
在 Header1
中删除 #include
行。在 Header2
中删除 #include "Header2.h"
。这应该可以解决问题。
当我尝试制作我的 DX11 引擎时,我遇到了一个非常奇怪的问题。我找不到问题所在。所以,我决定编写一些更简单的代码并尝试得到相同的错误。这个:
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*
,它工作正常。
好吧,如果你做到了这一步,谢谢。抱歉英语不好。
它不起作用,因为在定义 struct2 期间未定义 struct1,并且您在构造中使用了未定义的 struct poniter。
只需修复即可
struct struct2
{
struct2(struct struct1 *par1); // note the struct struct1 *
int copynum;
};
此外,如果您确实使用它,则不必依赖 Header2.h 中的 Header1.h(但在 Source2.cpp 中需要依赖)。
你的 header 有循环依赖。他们甚至包括他们自己,这很愚蠢。最终结果是 header 都没有得到正确处理。
在 Header1
中删除 #include
行。在 Header2
中删除 #include "Header2.h"
。这应该可以解决问题。