Pour répondre à la question qui vous a demandé: "parce que la norme dit".
Seules les variables statiques, constant, partie intégrante types (y compris les énumérations) peut être initialisé à l'intérieur d'une déclaration de classe. Si un compilateur prend en charge dans la ligne de l'initialisation de la flotte, il est une extension. Comme d'autres l'ont souligné, la façon de traiter avec statique, constante, non intégrale des variables est de définir et de les initialiser dans le fichier source correspondant (pas la tête).
C++ Standard Section 9.2 "Membres du groupe" article 4:
Un membre de demande de déclaration peut contenir un
constante d'initialiseur que si elle déclare un membre statique (9.4) de
const intégrale ou const énumération
type, voir 9.4.2.
Section 9.4.2 "Données Membres Statiques" article 2:
Si une donnée membre statique est de const
intégrale ou const type d'énumération,
sa déclaration dans la définition de classe
pouvez spécifier une constante de l'initialiseur
qui doit être une partie intégrante de la constante
l'expression de (5.19). Dans ce cas, l'
membre peuvent apparaître dans intégrale constante
les expressions. Le membre doit toujours être
défini dans un espace de noms portée si elle est
utilisées dans le programme et l'espace de noms
la définition de la portée ne doit pas contenir un
initialiseur.