Я думаю, что эта проблема немного за мной. Буду признателен за любую помощь.
В UIM_Commander.cpp мне нужно использовать (статический) метод из класса UIM_Parser
. Итак, в UIM_Commander.h я включил UIM_Parser.h , вот так:
#ifndef UIM_Commander_h
#define UIM_Commander_h
#include "..\sysm\SYSM.h"
#include "..\storm\STORM.h"
#include "..\ssqlm\SSQLM.h"
#include "..\inxm\INXM.h"
#include "UIM_Parser.h"
class UIM_Commander
{
.....
};
#endif
Однако это приводит к этой ошибке:
Ошибка 8, ошибка C2064: термин не оценивает функцию, принимающую 0 аргументов c: \ workspace \ sirenbase \ sirenbase \ uim \ uim_main.cpp 3
UIM_Main.cpp
#include "UIM_Main.h"
UIM_Commander commandCentre = UIM_Commander(); // <-- ERROR term does not evaluate to a function taking 0 arguments
list<string> stash;
int normal(int argc, char *argv[])
{
.....
}
int main(int argc, char *argv[])
{
.....
}
Естественно, я зарегистрировался в UIM_Main.h , но, похоже, UIM_Commander.h там уже включено:
#ifndef UIM_Main_h
#define UIM_Main_h
#define NORMAL_MODE true //set this to false to run testmain
#include "..\storm\STORM.h"
#include "UIM_Commander.h"
#include "UIM_tokens.h"
#include "UIM_Parser.h"
#include <list>
#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>
#include <vector>
using namespace std;
int main(int argc, char *argv[]);
int normal(int argc, char *argv[]);
#endif
Глобальный, commandCentre
, используется только в UIM_Parser.cpp , поэтому у меня он был extern в UIM_Parser.h :
#ifndef UIM_Parser_h
#define UIM_Parser_h
#include "UIM_Commander.h"
#include "UIM_Main.h"
#include "..\storm\STORM.h"
#include "UIM_tokens.h"
#include <list>
#include <string>
#include <sstream>
using namespace std;
extern UIM_Commander commandCentre; // <-- ALTERNATE ERROR missing ';' before identifier 'commandCentre'
//see below
extern list<string> stash;
class UIM_Parser
{
.....
};
#endif
Если это поможет, измените порядок в UIM_Main.h на
#include "UIM_tokens.h"
#include "UIM_Parser.h"
#include "UIM_Commander.h"
изменяет ошибку на
Ошибка 1, ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором 'commandCentre' c: \ workspace \ sirenbase \ sirenbase \ uim \ uim_parser.h 13
Итак, что я делаю не так? Это какое-то странное циклическое определение, от которого охранники включения не могут спасти меня?
EDIT:
Использование UIM_Commander commandCentre;
изменяет ошибку на
`Ошибка 7: ошибка C2086: 'int commandCentre': переопределение c: \ workspace \ sirenbase \ sirenbase \ uim \ uim_main.cpp 3
, если #include "UIM_Commander.h"
раньше #include "UIM_Parser.h"
в UIM_main.h . Если #include "UIM_Parser.h"
предшествует #include "UIM_Commander.h"
, то ошибка остается
Ошибка 1, ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором 'commandCentre' c: \ workspace \ sirenbase \ sirenbase \ uim \ uim_parser.h 13
ИЗМЕНИТЬ СНОВА : Я решил это благодаря ответу StevieG. Теперь UIM_Parser.h выглядит так:
#ifndef UIM_Parser_h
#define UIM_Parser_h
#include "UIM_Main.h"
#include "..\storm\STORM.h"
#include "UIM_tokens.h"
#include <list>
#include <string>
#include <sstream>
using namespace std;
class UIM_Commander;
extern UIM_Commander commandCentre;
extern list<string> stash;
class UIM_Parser
{
.....
};
#endif
Довольно аккуратно, да.