«термин не оценивает функцию, принимающую ...» в глобальном объекте - PullRequest
1 голос
/ 23 июня 2011

Я думаю, что эта проблема немного за мной. Буду признателен за любую помощь.

В 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

Довольно аккуратно, да.

Ответы [ 3 ]

1 голос
/ 23 июня 2011

Вы можете переслать объявление UIM_Commander в UIM_Parser.h и сохранить ваши включения вместе.

0 голосов
/ 23 июня 2011

Мой хороший друг решил это, я добавляю ответ сюда, потому что он не хочет.

Проблема в том, что UIM_Parser.h необходимо UIM_Commander.h , чтобы узнать, что такое UIM_Commander. В то же время, UIM_Commander.cpp требуется UIM_Parser.h , чтобы иметь возможность вызывать его методы.

Решение в UIM_Commander.h состоит в том, чтобы переместить #include "UIM_Parser.h" в конец файла, прямо перед #endif, например:

#ifndef UIM_Commander_h
#define UIM_Commander_h

#include "..\sysm\SYSM.h"
#include "..\storm\STORM.h"
#include "..\ssqlm\SSQLM.h"
#include "..\inxm\INXM.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);
}

.....
0 голосов
/ 23 июня 2011

Редактировать: Извините, старый ответ был BS.

Просто скажите:

UIM_Commander commandCentre;

Смысл конструктора по умолчанию заключается в том, чтоон вызывается по умолчанию, поэтому вам не нужно его указывать.Но даже если у вас был конструктор не по умолчанию, то, что вы сделали, неэффективно;не используйте конструктор копирования, но создайте напрямую:

Foo x = Foo(1,2,3); // silly copy!
Foo x(1,2,3);       // direct.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...