Пока я пытался сделать свой двигатель 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*
, он отлично работает.
Хорошо, если вы сделали это так далеко, спасибо. И извините за плохой английский.
Вы включаете 'Header1.h' в' Header1.h' и 'Header2.h' в' Header2.h'. Вероятно, это путает ваших охранников. Сначала вы должны исправить это. – juanchopanza
Что происходит, когда вы используете struct2 (struct struct1 * par1); вместо struct2 (struct1 * par1) ;? –
@juanchopanza Спасибо за ваш комментарий. Нет, это неважно, потому что без включения охранников Header1.h включает Header2.h, который включает Header1.h. Таким образом, они включают самих себя. Вот почему я использую include guard. Комментирование этих строк не работает. – LHLaurini