我觉得这个问题有点超出我的能力范围。如果有任何帮助,我将不胜感激。
在UIM_Commander.cpp中,我需要使用类UIM_Parser
中的(静态)方法。因此,在UIM_Commander.h中,我包含了UIM_Parser.h如下所示:
#ifndef UIM_Commander_h
#define UIM_Commander_h
#include "..sysmSYSM.h"
#include "..stormSTORM.h"
#include "..ssqlmSSQLM.h"
#include "..inxmINXM.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 "..stormSTORM.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中使用,所以我在UIM_Parser.h中将其作为外部:
#ifndef UIM_Parser_h
#define UIM_Parser_h
#include "UIM_Commander.h"
#include "UIM_Main.h"
#include "..stormSTORM.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
那么,我做错了什么?这是某种奇怪的循环定义吗,包含保护无法将我从中拯救出来?
编辑:
使用UIM_Commander commandCentre;
将错误更改为
`错误7错误C2086:"int commandCentre":重新定义c:\workspace\sirenbase\sirenbase \uim\uim_main.cpp 3
如果UIM_main.h中#include "UIM_Commander.h"
在#include "UIM_Parser.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 "..stormSTORM.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
很整洁,嗯。
您可以在UIM_Parser.h中转发声明UIM_Commander,并将包含保持在一起。。
编辑:对不起,原来的答案是BS.
只需说:
UIM_Commander commandCentre;
默认构造函数的要点是,它是默认调用的,所以你不需要指定它。但即使你有一个非默认构造函数,你所做的也是低效的;不要使用复制构造函数,而是直接构造:
Foo x = Foo(1,2,3); // silly copy!
Foo x(1,2,3); // direct.
我的一个好朋友解决了这个问题,我在这里添加了答案,因为他不想。
问题是,UIM_Parser.h需要UIM_Commander.h能知道UIM_Commander
是什么。同时,UI M_Commander.cpp还需要UI M_Parser.h才能调用其方法。
解决方案是,在UIM_Commander.h中,将#include "UIM_Parser.h"
移动到文件末尾的#endif
之前,如下所示:
#ifndef UIM_Commander_h
#define UIM_Commander_h
#include "..sysmSYSM.h"
#include "..stormSTORM.h"
#include "..ssqlmSSQLM.h"
#include "..inxmINXM.h"
class UIM_Commander
{
.....
};
#include "UIM_Parser.h"
#endif
或者,您可以将#include "UIM_Parser.h"
放在UIM_Commander.cpp:的开头
#include "UIM_Commander.h"
#include "UIM_Parser.h"
UIM_Commander::UIM_Commander()
{
storManager = new STORM_StorageManager();
sysManager = new SYSM_Manager(storManager);
sqlManager = new SSQLM_Manager(storManager);
indManager = new INXM_IndexManager(storManager);
}
.....