"术语不计算为函数taking"在全局对象中



我觉得这个问题有点超出我的能力范围。如果有任何帮助,我将不胜感激。

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);
}
.....

相关内容

  • 没有找到相关文章

最新更新