Здравствуйте, господа программисты. Никак не могу понять из-за чего компилятор выдает ошибку " illegal storage class".
Опишу в кратце ситуацию. Есть класс, который представляет БД, он должен быть всегда доступен другим различным классам. Причем всегда используется его единственный экземпляр, который создается при запуске программы. Исходя из таких соображений я объявляю экземпляр класса через extern в том же хидере, а в cpp файле с реализацией этого класса объявляю реальную переменную CWUnit *dbUn=0; В программе имеются другие классы схожего назначения и использующиеся таким же образом, но для них ошибка не выдается.
class CWUnit : public CExpertDatabase {
public:
CWUnit();
//коды полей даты
int GROUP_ID_Index;
int ID_Index;
int NAME_Index;
int BASE_Index;
int COEFF_Index;
int getGroupID(const int index) {return atoi(fastGetFieldPtr(GROUP_ID_Index,index));}
int getID(const int index) {return atoi(fastGetFieldPtr(ID_Index,index));}
const char *getName(const int index) {return fastGetFieldPtr(NAME_Index,index);}
int getBase(const int index) {return atoi(fastGetFieldPtr(BASE_Index,index));}
float getCoeff(const int index) {return atof(fastGetFieldPtr(COEFF_Index,index));}
int getGroupID() {return getGroupID(recNo());}
int getID() {return getID(recNo());}
const char *getName() {return getName(recNo());}
int getBase() {return getBase(recNo());}
float getCoeff() {return getCoeff(recNo());}
sUnitInfo getUnitInfo(int group_id, int unit_id);
CUnitList getUnitList(int group_id);
int getCoeffByCode(CWareDB *db, int ware_code, int unit_id);
private:
void getIndexes();
sUnitInfo getUnit();
};
extern CWUnit * dbUn;//здесь выдает ошибку
Хелп говорит по этому поводу следующее:
C/C++ Error 10078
illegal storage class
The compiler issues this error when an illegal storage class is used. This error is also generated when variables in a global scope are declared as auto (shown below).
auto int x;//error: auto is not allowed in global scope
Fix
Use a legal storage class.
static int x;
Пишу в CodeWarrior v5.2
Как быть?
Добавлено форматирование — Кодт
Здравствуйте, Valеntin, Вы писали:
V>Здравствуйте, господа программисты. Никак не могу понять из-за чего компилятор выдает ошибку " illegal storage class".
V>Опишу в кратце ситуацию. Есть класс, который представляет БД, он должен быть всегда доступен другим различным классам. Причем всегда используется его единственный экземпляр, который создается при запуске программы. Исходя из таких соображений я объявляю экземпляр класса через extern в том же хидере, а в cpp файле с реализацией этого класса объявляю реальную переменную CWUnit *dbUn=0; В программе имеются другие классы схожего назначения и использующиеся таким же образом, но для них ошибка не выдается.
V>V>class CWUnit : public CExpertDatabase {
V> public:
V> CWUnit();
V> //коды полей даты
V> int GROUP_ID_Index;
V> int ID_Index;
V> int NAME_Index;
V> int BASE_Index;
V> int COEFF_Index;
V> int getGroupID(const int index) {return atoi(fastGetFieldPtr(GROUP_ID_Index,index));}
V> int getID(const int index) {return atoi(fastGetFieldPtr(ID_Index,index));}
V> const char *getName(const int index) {return fastGetFieldPtr(NAME_Index,index);}
V> int getBase(const int index) {return atoi(fastGetFieldPtr(BASE_Index,index));}
V> float getCoeff(const int index) {return atof(fastGetFieldPtr(COEFF_Index,index));}
V> int getGroupID() {return getGroupID(recNo());}
V> int getID() {return getID(recNo());}
V> const char *getName() {return getName(recNo());}
V> int getBase() {return getBase(recNo());}
V> float getCoeff() {return getCoeff(recNo());}
V> sUnitInfo getUnitInfo(int group_id, int unit_id);
V> CUnitList getUnitList(int group_id);
V> int getCoeffByCode(CWareDB *db, int ware_code, int unit_id);
V> private:
V> void getIndexes();
V> sUnitInfo getUnit();
V>};
V>extern CWUnit * dbUn;//здесь выдает ошибку
V>
кодвориора нет под рукой, так что варианты наугад
1) где-то определен макрос extern -- вставь проверку типа
#ifdef extern
#error
#endif
2) Замени глобальную переменную на синглетон (Если у тебя только одна глобальная переменная этого типа). Если не знаешь, что это такое -- Поиск по сайту/в статьях. Советую посмотреть на синглетон Маерса, тот, где:
static Class & getInstance()
{
static Class instance;
return instance;
}
Здравствуйте, BitField, Вы писали:
BF>кодвориора нет под рукой, так что варианты наугад
BF>1) где-то определен макрос extern -- вставь проверку типа
BF>BF>#ifdef extern
BF>#error
BF>#endif
BF>
BF>2) Замени глобальную переменную на синглетон (Если у тебя только одна глобальная переменная этого типа). Если не знаешь, что это такое -- Поиск по сайту/в статьях. Советую посмотреть на синглетон Маерса, тот, где:
BF>BF>static Class & getInstance()
BF>{
BF> static Class instance;
BF> return instance;
BF>}
BF>
Спасибо! Разобрался. Причина была в том, что по оплошности в одном из классов использующих данный класс, инклуд на файл был вставлен прямо перед методом который работает с объектами такого класса, а не в начале файле.
class OtherClass {
public:
void method1();
include "CWUnit.h"
void method2(CWUnit &unit);
};