一个非常奇怪的C ++行为

时间:2015-01-20 19:34:34

标签: c++ struct visual-studio-2013 compiler-errors

当我试图制作我的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*,则可以正常使用。

好吧,如果你做到这一点,谢谢。抱歉英语不好。

2 个答案:

答案 0 :(得分:3)

您的标头具有循环依赖关系。他们甚至包括自己,这是愚蠢的。最终结果是没有标头得到正确处理。

Header1中删除#include行。在Header2删除#include "Header2.h"。这应该可以解决问题。

答案 1 :(得分:-3)

它不起作用,因为在struct2的定义期间没有定义struct1,并且在构造中使用了未定义的struct poniter。

简单修复就是

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

如果你使用它,你也不必依赖Header2.h中的Header1.h(但是你在Source2.cpp中)。