множественная ошибка определения для статических членов класса const - PullRequest
0 голосов
/ 05 мая 2011

Недавно я столкнулся с проблемой, описанной в Странные неопределенные символы статических констант внутри структуры / класса , и я пытаюсь привести свой код в соответствие, добавив определения в соответствующие файлы .cpp для всехмои статические члены класса const, а не только те, которые вызывали ошибки компоновщика.

В тех случаях, когда константа используется в нескольких единицах компиляции, я получаю несколько ошибок определения, даже если определение только в одномединиц компиляции.

Перемещение инициализаторов в определения предотвращает ошибки, но я бы не стал этого делать.

Для чего это стоит, пока я работаю в Visual Studio, этокод должен быть построен на нескольких платформах.

Ответы [ 4 ]

3 голосов
/ 05 мая 2011

Статические переменные-члены объявляются в теле класса и определяются один раз за пределами тела класса.Общий способ сделать это:

class MyClass

{
    static int i;

};

int MyClass::i = 0;

Определение выполняется в исходных файлах C ++, а не в заголовке (.h).Если это будет сделано, переменная будет определена везде, где будет включен заголовочный файл.Похоже, вы столкнулись с этой же проблемой.

1 голос
/ 05 мая 2011

Если у вас включены языковые расширения, Visual Studio позволит вам использовать статические константные объекты без определения в файле реализации.К сожалению, это приведет к ошибке (если я правильно помню) для правильных программ на C ++, когда есть явное определение.

Попробуйте отключить языковые расширения.

1 голос
/ 05 мая 2011

Согласно одному из постов на http://bytes.com/topic/c/answers/710704-const-static-initialization-visual-studio это может быть визуальная ошибка студии, мешающая вам использовать эту форму инициализации.

К сожалению, я думаю, что вы можете застрять при инициализации в исходном файле для поддержки переносимости.

Я создал простой пример, который прекрасно компилировался и связывался в g ++ 4.2.

0 голосов
/ 05 мая 2011

Я думаю, что если вы хотите, чтобы ваш код работал на нескольких платформах, вы должны переместить инициализацию в определение (в файле .cpp).Хотя он может работать иначе на одном или нескольких компиляторах, не полагайтесь на его переносимость.

...