Вы определяете статический член period
, записывая const int abc::period;
. Вы можете предоставить инициализатор класса in для static const
члена класса, но это не определение, а просто объявление.
9.4.2 / 4 - Если член статических данных имеет константный интеграл или константный тип перечисления, его объявление в определении класса может указывать инициализатор константы, который должен быть выражением целочисленной константы (5.19). В этом случае член может появляться в виде целочисленных константных выражений. Член по-прежнему должен быть определен в области имен, если он используется в программе, а определение области имен не должно содержать инициализатор.
Ваш код компилируется даже без определения, потому что вы не берете адрес статического члена. Бьярн Страуструп упоминает в C ++ - FAQ здесь , что Вы можете взять адрес статического члена, если (и только если) он имеет определение вне класса