To answer the actual question you asked: "because the standard says so".
Only variables of static, constant, integral types (including enumerations) may be initialized inside of a class declaration. If a compiler supports in-line initialization of floats, it is an extension. As others pointed out, the way to deal with static, constant, non-integral variables is to define and initialize them in the class's corresponding source file (not the header).
C++ Standard Section 9.2 "Class Members" item 4:
A member-declarator can contain a
constant-initializer only if it declares a static member (9.4) of
const integral or const enumeration
type, see 9.4.2.
Section 9.4.2 "Static Data Members" item 2:
If a static data member is of const
integral or const enumeration type,
its declaration in the class de?nition
can specify a constant-initializer
which shall be an integral constant
expression (5.19). In that case, the
member can appear in integral constant
expressions. The member shall still be
de?ned in a namespace scope if it is
used in the program and the namespace
scope de?nition shall not contain an
initializer.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…