Вы можете использовать static const
переменную-член целочисленного типа в константном выражении, только если
- инициализировано с константным выражением и
- , что константное выражение видновремя его использования.
В вашем switch
значение Parent::A
видно, потому что его инициализатор находится в заголовочном файле Parent.h.То же самое касается Child::C
.Значение Child::D
видно, потому что его инициализатор встречается раньше в Child.cpp.
Однако значение Parent::B
не отображается: исходные файлы C ++ компилируются отдельно, поэтому при компиляции Child.cpp,компилятор знает, что Parent::B
является static const
переменной-членом целочисленного типа, но он не знает, каково ее значение.Таким образом, его нельзя использовать в константном выражении в Child.cpp.
Обратите внимание, что если вы когда-либо используете Parent::A
в качестве объекта (например, &Parent::A
), вам все равно понадобитсяопределить B
в Parent.cpp, используя const unsigned long Parent::A;
, без инициализатора, поскольку вы помещаете инициализатор в определение класса.