2013-05-24 2 views
0

Я использую библиотеки allegro 5 для разработки игры на C++ в течение некоторого времени. Сегодня я получил некоторые странные ошибки:C++ Странная ошибка. Не удалось скомпилировать

У меня есть класс под названием level. У меня есть файл заголовка levelhandler. Вот как это выглядит:

#pragma once 
#include "level.h" 

level level_1; 

level *currentlevel; 

void initialize_levels() 
{ 

    currentlevel = &level_1; 

} 

Когда я пытаюсь скомпилировать его дает мне странные ошибки, такие как:

error C2086: 'int level' redefinition 
error C2143: syntax error : missing ; before 'level_1' 

я помню, что она может составить до этого, и я использовал currentlevel->Player.X много раз, но теперь у меня есть много, что и дает ошибки, подобные этим:

error C2227: left of '->Player' must point to a class/struct/generic type 
error C4430: missing type specifier - int assumed 

заголовок, вставленный из комментария

#pragma once 
#include "entity.h" 
// some more includes 
class level { 
public: 
    enum Tileset { ... }; 
    enum Tile { ... }; 
    int tiles[200][200]; 
    player Player; 
    level(void); 
    ~level(void); 
}; 
+0

Возможно, вы забыли; после определения класса в файле заголовка. Я получил почти те же ошибки с тестовой программой, где; отсутствует: http://rise4fun.com/Vcpp/Jd7 – Vincent

+0

Может быть, заголовок объявляет 'уровень' внутри пространства имен? –

+1

Нет. Заголовочный файл не является частью какого-либо класса. Однако он может определить класс. Вы покажете файл заголовка 'level.h'? – harper

ответ

0

Такие ошибки трудно найти, как долго, как вы смотрите на «Список ошибок» панели. Выберите «Просмотр/вывод», чтобы отобразить представление «Выход». Строка после ошибки C2086 показывает исходное определение уровня.

Вы заполняете найти

int level; 

там как C2086 говорит вам. Если это линия

level level_1; 

вашего кулака, например, вы должны проверить последний файл заголовка включить в модуле компиляции. Он может заканчиваться int или имеет неуравновешенный пункт #if.

Чтобы узнать точную координаты местоположения, используйте Short, Self Contained, Correct (Compilable), Example. Это поможет вам найти ошибку и сэкономить время других с помощью хрустальных шаров.

Edit:

Другой способ найти причину этого неожиданного поведения видеть вывод препроцессора. Установите Generate Preprocessed File вариант ИНТ страницы проекта недвижимости C/C++/препроцессор With line numbers (/P) и посмотреть в сгенерированном <sourcefile>.i

Убедитесь, что этот файл level.h включил то, что вы хотели.

+0

Итак, переопределение уровня int: фактически указывает на строку 6, которая является объектом второго уровня , Я предполагаю, что это потому, что он не видит уровень как спецификатор типа, поэтому он принимает его как значение по умолчанию, и это дает синтаксическую ошибку c2146 «missing»; до идентификатора level_1, и когда он читает строку 6, он дает ошибку переопределения. Единственное, что я не понимаю, - это то, почему это произойдет, если при наборе кода программа четко распознает уровень класса и даже перечисляет его члены. - упаковал заголовки и объект в новый проект и компилируется отлично. – HuniSan

+0

Если ответ решает вашу проблему, вы можете нажать «Принять» чек m ark. – harper

0

Хорошо, поэтому я проводил свой проект в выходные дни, и я наконец выяснил, в чем проблема, которая дала мне столько странных ошибок компилятора. Кажется, что у меня было много случаев, когда два файла заголовка включали друг друга, а компилятору действительно это не нравилось, поэтому я исправил это, и теперь я в порядке. Спасибо всем за то, что помогли мне, и у меня отличный день!

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