доступ к переменным членам статического класса C ++ в нескольких исходных файлах - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть пара классов.У одного из них есть набор статических констант uint32_t (следующий код является урезанным примером):

class Foo {
public:
    static const uint32_t BAZ;
    void RunMe(void);
};
class Bar {
public:
    void RunMeAlso(void);
};

Я делаю обычные вещи по одному классу на файл cpp, так как реальные классы довольнозначительный, но я столкнулся с проблемой.И Foo::RunMe(), и Bar::RunMeAlso() имеют доступ к значению Foo::BAZ.

. У меня есть определение const uint32_t Foo::BAZ = 1; в файле foo.cpp, но он содержит ошибку компиляции в bar.cpp (где ониспользуется в качестве метки регистра в операторе switch) в VS2010 (хотя этот код должен быть переносимым, но я еще не проверял его с помощью gcc).Оба заголовочных файла включены в оба исходных файла ... и попытка поместить какую-то внешнюю ссылку в bar.cpp, чтобы сообщить компилятору, что он находится в другом модуле перевода, это не решает (создает больше ошибок компиляции) ...и, конечно, все примеры, которые я нашел по этому виду, относятся к тривиальному случаю отдельных классов / файлов, когда кто-то не знал / забыл использовать определение в дополнение к объявлению.

Мысликто-нибудь, как решить это?(Я бы предпочел не использовать enum, но будет, если это единственный другой вариант, так как я уверен, что он скомпилируется!)

TIA,

-J

1 Ответ

3 голосов
/ 08 сентября 2011

Метки регистра должны быть константами компилятора.Статическая переменная-член не является константой компилятора, если она не является константой и инициализируется в объявлении с помощью константного выражения.

Итак:

  • Объявите ее static const uint32_t BAZ = 1; в заголовке;или
  • Используйте if вместо switch.

Кстати, обычно полезно прочитать фактическое сообщение об ошибке.И отправьте это, если вы собираетесь спросить об этом ...

...