У меня есть большой движок для компиляции, и он работал нормально, пока я не сделал некоторые сумасшедшие настройки. Компилятор так или иначе не может преобразовать мой средний объект Game и произвести error C2061: syntax error : identifier 'Game'
и кажется, что независимо от того, какой файл я компилирую, ошибка всегда указывает на файл с именем GameDataLoader.h
даже нет абсолютно никакой связи с этими двумя файлами. Обычно я думаю, что это проблема включения, но на самом деле у меня есть Game.h
включается в каждый необходимый файл .h, сразу после включения stdafx.h и у меня #pragama once
на нем. Я думал о проблеме кругового включения, но #pragma once
должен позаботиться об этом. Плюс это директивы включения работает нормально, пока я не изменил имя файла и другие грязные вещи. Я очистил все решение и попытался восстановить его, но все равно не повезло (используя VS2012).
Я не знаю, поможет ли показ кода, но вот код для gameDataLoader.h
, Это не файл, который я написал, но он должен работать правильно.
#pragma once
#include "stdafx.h"#include "Game\Game.h" // Game.h included
class GameDataLoader
{
public:
GameDataLoader(){}
~GameDataLoader(){}
void GameDataLoader::loadGameProperties( Game *game, map<wstring, wstring> *properties, wstring gameInitFile);
virtual void loadGame(Game *game, wstring gameInitFile) = 0;
virtual void loadGUI(Game *game, wstring guiInitFile) = 0;
virtual void loadWorld(Game *game, wstring levelInitFile) = 0;
};
И у меня были ошибки именно на этих 4 строках с объектом Game. В чем может быть проблема?
Двойное включение? Круговое включение? Или не включили что-то и где-то еще?
Более вероятный, Game.h
в том числе GameDataLoader.h
прямо или косвенно, создавая круговую зависимость; но ты забыл показать нам Game.h
Так что я не могу быть уверен в этом.
Если это так, то #pragma once
(или эквивалентное включение защиты) будет означать, что один из заголовков будет включен раньше другого, а объявления второго не будут доступны первому. Он не будет волшебным образом включать их обоих друг перед другом, поскольку это невозможно.
К счастью, GameDataLoader.h
не нужно полное определение Game
, поскольку он имеет дело только с указателями на него. Таким образом, вы можете удалить включение Game.h
и просто объявить class Game;
вместо.
Других решений пока нет …