2015-01-20 6 views
0

Пока я пытался сделать свой двигатель 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*, он отлично работает.

Хорошо, если вы сделали это так далеко, спасибо. И извините за плохой английский.

+0

Вы включаете 'Header1.h' в' Header1.h' и 'Header2.h' в' Header2.h'. Вероятно, это путает ваших охранников. Сначала вы должны исправить это. – juanchopanza

+1

Что происходит, когда вы используете struct2 (struct struct1 * par1); вместо struct2 (struct1 * par1) ;? –

+0

@juanchopanza Спасибо за ваш комментарий. Нет, это неважно, потому что без включения охранников Header1.h включает Header2.h, который включает Header1.h. Таким образом, они включают самих себя. Вот почему я использую include guard. Комментирование этих строк не работает. – LHLaurini

ответ

3

Ваши заголовки имеют круглые зависимости. Они даже включают себя, что глупо. Конечным результатом является то, что ни один из заголовков не обрабатывается должным образом.

Header1 удалить #include линий. В Header2 удалить #include "Header2.h". Это должно решить проблему.

+0

Теперь я понял. 'Header1.h' не нужен' Header2.h'. Благодарю. – LHLaurini

-3

Это не работает, потому что во время определения struct2 структура1 не определена, и вы используете неопределенный структурный poniter в своей конструкции.

Просто исправить будет

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

Также вы не должны зависеть от Header1.h в Header2.h (но вы в Source2.cpp), если вы используете это.

+0

И почему не определена 'struct1', если включен' Header1.h'? Потому что вложения перепутаны. – juanchopanza

+0

Вы правы. Я заметил это сейчас. – LHLaurini

+0

@juanchopanza Я согласен с вами, но Header1 зависит от Header2, а Header2 зависит от Header1. Что может сделать пользователь? –

Смежные вопросы